spring属性注入DI
spring setter方式注入:
注入对象属性:
前提:
在bean对应实体中有对应的setter方法。
基础代码:
在bean中有另一个bean属性的setter方法。 package cn.itcast.dao.impl; import cn.itcast.dao.PersonDao; public class PersonDaoBean implements PersonDao { public void add(){ System.out.println("执行PersonDaoBean中的add()方法"); } } package cn.itcast.service.impl; import cn.itcast.dao.PersonDao; import cn.itcast.service.PersonService; public class PersonServiceBean implements PersonService { private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public PersonDao getPersonDao() { return personDao; } public void save(){ personDao.add(); } }
ref方式注入:
<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"> <property name="personDao" ref="personDao"></property> </bean> name:注入的属性 ref:值所对应的bean的id
内部类方式::
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"> <property name="personDao"> <bean class="cn.itcast.dao.impl.PersonDaoBean"/> </property> </bean>
两种方式的比较:
前者的bean可以被其他bean使用,后者的内部bean不能被其他bean使用
基本数据类型的注入:
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"> <property name="personDao" ref="personDao"></property> <property name="name" value="itcast"/> <property name="id" value="12"/> </bean>
集合属性的注入:
准备工作:
public class PersonServiceBean implements PersonService { private PersonDao personDao; private Set<String> sets=new HashSet<String>(); private List<String> lists=new ArrayList<String>(); private Properties properties=new Properties(); private Map<String,String> maps=new HashMap<String,String>(); 。。。 }
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"> <property name="personDao" ref="personDao"></property> <property name="sets"> <set> <value>第一个</value> <value>第二个</value> <value>第三个</value> </set> </property> <property name="lists"> <list> <value>第一</value> <value>第二</value> <value>第三</value> </list> </property> <property name="properties"> <props> <prop key="key1">value1</prop> <prop key="key2">value2</prop> <prop key="key3">value3</prop> </props> </property> <property name="maps"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> <entry key="key3" value="value3"/> </map> </property> </bean>
构造器注入:
public PersonServiceBean(PersonDao personDao,String name){ this.personDao=personDao; this.name=name; } <bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"> <constructor-arg index="0" type="cn.itcast.dao.PersonDao" ref="personDao"/> <constructor-arg index="1" value="....."/> </bean>
注意:如果写了type,type对应的不是bean对象对应的实际type而是你的构造器中的参数的实际type。
field注入:(注解注入)
准备工作:
spring使用注解要先加入声明:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
启动注解配置:
<context:annotation-config/>
例子:
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/>
这个配置隐式注入了多个对注释进行解析处理的处理器。
注入注解:
@Autowired(required=""):按类型装配
required属性类型为boolean,默认值为false,如果写为true的话,装配失败会报异常,如果为false,装配失败会装配null进去
@Resource(name=""):
name属性给了值的话直接查找对应的bean进行注入,如果name没有给值,先将name当成字段名在beans中查找,找不到再按类型查找对应的类型的bean进行注入
两个注解都可以写在属性上,也可以写在属性的setter方法上
@Autowired private PersonDao personDao;
@Resource(name="personDao") private PersonDao personDao;
按名称装配还可以这样写:
@AutoWried(required=true) @Qualifier(value="xxx")
前面学习注解的时候说过:注解中如果变量名为value的话,使用的时候可以省略掉value=
自动装配
了解即可,不建议使用,因为结果具有不可预知性。
例子:
<bean id="..." class="..." autowire="byType"/>
autowire属性取值如下:
byType对应上面的@AutoWried
byName对应上面的@Resource
constructor与byType类似,应用于构造参数,如果容器中没有找到匹配的bean,会抛出异常
autodetect:通过bean类的自省(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
注意一点:
如果装配找到多个匹配的bean,也会抛出异常。