参考:
http://blog.csdn.net/woshiwxw765/article/details/7603497
http://www.yiibai.com/spring/spring-auto-scanning-components.html
Spring 注入集合
下面例子向您展示Spring如何注入值到集合类型(List, Set, Map, and Properties)。 支持4个主要的集合类型:
List – <list/>
Set – <set/>
Map – <map/>
Properties – <props/>
使用EL表达式注入集合:http://www.yiibai.com/spring/spring-el-lists-maps-example.html
MyCollection.java
//package com.peng.collection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class MyCollection {
private List<Object> lists;
private Set<Object> sets;
private Map<Object, Object> maps;
private Properties pros;
//setter and getter
@Override
public String toString() {
return "MyCollection [lists=" + lists + ", sets=" + sets + ", maps=" + maps + ", pros=" + pros + "]";
}
}
Person.java
package com.peng.pc;
public class Person {
private String name;
private String address;
private int age;
//setter and getter
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", age=" + age + "]";
}
}
Bean.xml
bean 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="MyCollectionBean" class="com.peng.collection.MyCollection">
<!-- java.util.List -->
<property name="lists" >
<list>
<value>1</value><!-- 第一个list数据 -->
<ref bean="PersonBean"/><!-- 第二个list数据 -->
<bean class="com.peng.pc.Person"><!-- 第三个list数据 -->
<property name="name" value="list哈罗" />
<property name="address" value="list罗马" />
<property name="age" value="29" />
</bean>
</list>
</property>
<!-- java.util.Set -->
<property name="sets">
<set>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.peng.pc.Person">
<property name="name" value="set哈罗" />
<property name="address" value="set罗马" />
<property name="age" value="29" />
</bean>
</set>
</property>
<!-- java.util.Map -->
<property name="maps">
<map>
<entry key="Key 1" value="1" />
<entry key="Key 2" value-ref="PersonBean" />
<entry key="Key 3">
<bean class="com.peng.pc.Person">
<property name="name" value="map简单" />
<property name="address" value="map越南" />
<property name="age" value="30" />
</bean>
</entry>
</map>
</property>
<!-- java.util.Properties -->
<property name="pros">
<props>
<prop key="admin">admin@peng.com</prop>
<prop key="support">support@peng.com</prop>
</props>
</property>
</bean>
<bean id="PersonBean" class="com.peng.pc.Person">
<property name="name" value="哈罗" />
<property name="address" value="罗马" />
<property name="age" value="28" />
</bean>
</beans>
TestMyCollection.java
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.peng.collection.MyCollection;
public class TestMyCollection {
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
MyCollection mycollection = (MyCollection)context.getBean("MyCollectionBean");
System.out.println(mycollection);
}
}
输出结果:
MyCollection [lists=[1, Person [name=哈罗, address=罗马, age=28], Person [name=list哈罗, address=list罗马, age=29]], sets=[1, Person [name=哈罗, address=罗马, age=28], Person [name=set哈罗, address=set罗马, age=29]], maps={Key 1=1, Key 2=Person [name=哈罗, address=罗马, age=28], Key 3=Person [name=map简单, address=map越南, age=30]}, pros={admin=admin@peng.com, support=support@peng.com}]
依赖检查模式
定义了类的属性,判断是否赋值
public class Customer {
private Person person;
private int type;
private String action;
//getter and setter methods
}
<bean id="CustomerBean" class="com.yiibai.common.Customer" dependency-check="simple" >
<property name="action" value="buy" />//这里只给 action赋值了
</bean>
4个依赖检查支持的模式:
none – 没有依赖检查,这是默认的模式。
simple – 如果基本类型(int, long,double…)和集合类型(map, list..)的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。
objects – 如果对象类型的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。
all – 如果任何类型的任何属性都没有被设置,UnsatisfiedDependencyException将被抛出。
注:默认模式是 none
详细例子:http://www.yiibai.com/spring/spring-properties-dependency-checking.html
自动扫描组件
通常情况下,声明所有的Bean类或组件的XML bean配置文件,这样Spring容器可以检测并注册Bean类或组件。 其实,Spring是能够自动扫描,检测和预定义的项目包并实例化bean,不再有繁琐的Bean类声明在XML文件中。
AutoDao.java
package com.peng.autoscan;
import org.springframework.stereotype.Component;
@Component
public class AutoDao {
@Override
public String toString() {
return "Hello , This is AutoDao";
}
}
AutoService.java
package com.peng.autoscan.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.peng.autoscan.AutoDao;
@Service("AAA")//自定义名称
@Component
public class AutoService {
@Autowired//自动装配
private AutoDao autoDao;
public void setAutoDao(AutoDao autoDao) {
this.autoDao = autoDao;
}
@Override
public String toString() {
return "AutoService [autoDao=" + autoDao + "]";
}
}
auto.xml
bean配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.peng.autoscan"></context:component-scan>
</beans>
TestAutoScanning.java
执行类
package com.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.peng.autoscan.service.AutoService;
/**
* 测试自动组件扫描,变量要@Autowired
* @author Peng
* @Date2016年11月23日下午4:51:09
*/
public class TestAutoScanning {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("auto.xml");
AutoService au = (AutoService) context.getBean("AAA");//使用了自定义名称@Service
System.out.println(au);
}
}
执行结果:
AutoService [autoDao=Hello , This is AutoDao]
自动扫描注释类型
在Spring2.5中,有4种类型的组件自动扫描注释类型
@Component – 指示自动扫描组件。
@Repository – 表示在持久层DAO组件。
@Service – 表示在业务层服务组件。
@Controller – 表示在表示层控制器组件。
所有的 @Repository, @Service 或 @Controller 被注解为 @Component。因此,我们可以只使用 @Component 对所有组件进行自动扫描?是的,Spring会自动扫描所有组件的 @Component 注解。
它工作正常,但不是一个好的做法,为便于阅读,应该始终声明@Repository,@ Service 或 @Controller 在指定的层,使你的代码更易于阅读
过滤组件自动扫描
过滤组件 - 包含
用Spring “过滤” 扫描并注册匹配定义“regex”,即使该类组件的名称未标注 @Component 。
AutoDao.java
package com.peng.autoscan;
public class AutoDao {
@Override
public String toString() {
return "Hello , This is AutoDao";
}
}
AutoService.java
package com.peng.autoscan.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.peng.autoscan.AutoDao;
public class AutoService {
@Autowired//自动加载
private AutoDao autoDao;
@Override
public String toString() {
return "AutoService [autoDao=" + autoDao + "]";
}
}
auto.xml
"><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- <context:component-scan base-package="com.peng.autoscan"></context:component-scan> -->
<context:component-scan base-package="com.peng" >
<context:include-filter type="regex"
expression="com.peng.autoscan.*Dao.*" />
<context:include-filter type="regex"
expression="com.peng.autoscan.service.*Service.*" />
</context:component-scan>
</beans>
没有了自定义名称,只能用首字母小写的形式。
AutoService au = (AutoService) context.getBean("autoService");
过滤组件 - 不包含
另外,您还可以排除指定组件,以避免 Spring 检测和 Spring 容器注册。不包括在这些文件中标注有 @Service 。
<context:component-scan base-package="com.peng" >
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
不包括那些包含Dao这个词组文件名。
<context:component-scan base-package="com.peng" >
<context:exclude-filter type="regex"
expression="com.peng.autoscan.*Dao.*" />
</context:component-scan>
自动装配属性
@Autowired//自动装配
private AutoDao autoDao;
就是自动装配,如果不装配,就为null。也可以使用@Resource来装配
@Resource//自动装配
private AutoDao autoDao;
这两个注解的区别是:
@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
建议使用@Resource
使用@Autowired需要在xml文件中配置信息
第一种方式(只能用@Autowired,因为你引入的包就是 org…AutowiredAnnotatio…,不能用@Resource):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
</beans>
第二种方式(@Resource和@Autowired,都可以使用):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:annotation-config></context:annotation-config>
另外@Resource可以用来标注在字段或属性的setter方法上.如果标注在字段上,则可以省略掉该属性的getter 和setter方法。
上个例子的中的 autoDao 的setter 方法可以省略(如果你在手动在xml文件中配置,则不行,必须是自动扫描的前提下)
public void setAutoDao(AutoDao autoDao) {
this.autoDao = autoDao;
}
@Autowired装配实例
默认情况下,@Autowired将执行相关检查,以确保属性已经装配正常。当Spring无法找到匹配的Bean装配,它会抛出异常。要解决这个问题,可以通过 @Autowired 的“required”属性设置为false来禁用此检查功能。
如果bean配置文件有两个类型相同的对象,如 personA,personB,可以通过设置 @Qualifier 自动装配一个特定的 bean
public class Customer {
//按类型装配
@Autowired(required=false)//禁用此检查功能,找不到不会b报错
@Qualifier("personA")
private Person person;
private int type;
private String action;
//setter and getter
//toString..
}
public class Person {
private String name;
//setter and getter
//toString..
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- // by www.yiibai.com -->
<!-- <bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
-->
<context:annotation-config></context:annotation-config>
<bean id="customer" class="com.yiibai.common.Customer">
<property name="action" value="buy" />
<property name="type" value="1" />
</bean>
<bean id="personA" class="com.yiibai.common.Person">
<property name="name" value="YiibaiA" />
</bean>
<bean id="personB" class="com.yiibai.common.Person">
<property name="name" value="YiibaiB" />
</bean>
</beans>
执行类
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Customer cust = (Customer) context.getBean("customer");
System.out.println(cust);
执行结果:
Customer [person=Person [name=YiibaiA], type=1, action=buy]
更多实例http://www.yiibai.com/spring/spring-auto-wiring-beans-with-autowired-annotation.html