spring学习笔记3--依赖注入对象
2013-05-02 22:25
627 查看
手工注入扩展:/article/3808527.html
前言:自己在复习spring相关知识,特此记录,欢迎大家交流指正-----QQ:767872620
(2)属性setter方法式注入:
对于集合属性的注入:
测试:
(3)使用内部bean注入
缺点:bean多时,xml冗长
2.使用Field注入(用于注解方式)
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation中导入:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
说明:
bean节点下的:
<!-- 注解注入 -->
<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,
RequestAnnotationBeanPostProcessor
注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar
1.@Autowired默认按类型装配
(1)用于类属性上
@Autowired
public PersonDao persondao;
(2)用于setter方法上
@Autowired
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
说明:
@Autowired注解是按照类型装配依赖对象。
默认情况下他要求依赖对象必须存在,如果允许为null值,可以设置它的required属性为false。
如果我们想使用按字段名称装配,可以结合@Qualifier注解一起使用
@Autowired@Qualifier("PersonDaoBean")
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
2.@Resource:默认按名称装配,当找不到与名称匹配的bean才会按照类类型装配。
.@Resource和@Autowired一样,也可以标注在字段或是属性的setter方法上,但他默认按照名称装配。
名称可以通过@Resource的name属性指定。如果没有指定name属性,当注解标注在字段上,即默认取字段的名称,作为bean名称寻找依赖对象;当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Resource(name="PersonDaoBean") //@Resource
public PersonDao persondao;
@Resource(name="PersonDaoBean") //@Resource
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
注意:
如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时,@Resource注解会回退到按照类型装配。但一旦指定了name属性,就只能按照名称装配。
二、自动装配 不推荐使用
如:
<bean id=" " class=" " autowire=“byType”/>
autowire属性:
(1)byType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。
(2)byName:按名称装配,可以根据属性的名称,在容器中寻找跟该名称匹配的bean。如果没有找到,即属性值为null。
(3)constructon与byType的方式类似,不同之处在于它应用与构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常。
(4)autodetect:通过bean类的自省机制(introspection)来决定是使用constructon还是使用byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
建议:
自动装配:开发人员将无法预见最终的装配结果。
前言:自己在复习spring相关知识,特此记录,欢迎大家交流指正-----QQ:767872620
一、手工装配
1.在xml配置文件中,通过bean节点配置
(1)构造器式注入:<!--constructor-arg使用构造器注入,index为构造器参数索引,明确定义构造函数 --> <constructor-arg index="0" ref="PersonDaoBean"/> <constructor-arg index="1" value="要西"/>
(2)属性setter方法式注入:
<bean id="PersonServiceref" class="cn.itcast.service.imp.PersonServiceBeanref"> <property name="persondao" > <bean id="PersonDaoBean" class="cn.itcast.dao.imp.PersonDaoBean"></bean> </property> <property name="name" value="张鑫"></property> <property name="id" value="88"></property> <property name="age" value="18"></property> </bean>
对于集合属性的注入:
<bean id="PeersonCollectionBean" class="cn.itcast.service.imp.PeersonCollectionBean"> <!--constructor-arg使用构造器注入,index为构造器参数索引,明确定义构造函数 --> <!--<constructor-arg index="0" ref="PersonDaoBean"/>--> <!--<constructor-arg index="1" value="要西"/> --> <property name="sets"> <set> <value>第一个set值</value> <value>第二个set值</value> <value>第三个set值</value> </set> </property> <property name="lists"> <list> <value>第一个list值</value> <value>第二个list值</value> <value>第三个list值</value> </list> </property> <property name="properties"> <props> <prop key="key1">第一个properties值</prop> <prop key="key2">第二个properties值</prop> <prop key="key3">第三个properties值</prop> </props> </property> <property name="maps"> <map> <entry key="key1" value="第一个map值"></entry> <entry key="key2" value="第二个map值"></entry> <entry key="key3" value="第三个map值"></entry> </map> </property> </bean>
public class PeersonCollectionBean implements PersonCollects { /** * (1)构造器注入 */ /** * (2)注解注入 * 1.用在属性上 * @Resource 在没有指定name属性是默认按照名称装配(配置文件中的id),不行按照类装配 * * @Resource(name=" ") 只能按照名称装配,没找到给以null,报错 * */ @ItcastResource //自定义注解 //@Resource public PersonDao persondao; public String name; /** * set方法集合属性注入 */ public Set<String> sets = new HashSet<String>(); /** * 注解使用在setter方法上,用setter方式注入 * @param persondao */ public void setPersondao(PersonDao persondao) { this.persondao = persondao; } /** * 使用构造器注入,必须明确定义一个构造器 * 此时配置文件中必须包含constructor-arg标签 */ /* public PeersonCollectionBean(PersonDao persondao, String name) { super(); this.persondao = persondao; this.name = name; } */ public List<String> lists = new ArrayList<String>(); public Properties properties = new Properties(); public Map<String,Object>maps = new HashMap<String,Object>(); public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } public void setLists(List<String> lists) { this.lists = lists; } public List<String> getLists() { return lists; } public Set<String> getSets() { return sets; } public void setSets(Set<String> sets) { this.sets = sets; } public void Save(){ this.persondao.add(); System.out.println(this.name); }
测试:
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml"); PersonCollects pcs =(PersonCollects) cxt.getBean("PeersonCollectionBeannew"); *//** * set方法注入 *//* System.out.println("**************set集合注入*****************"); for(String value:pcs.getSets()){ System.out.println(value); } System.out.println("**************list集合注入*****************"); for(String value:pcs.getLists()){ System.out.println(value); } System.out.println("**************properties集合注入*****************"); for(Object value:pcs.getProperties().keySet()){ System.out.println(pcs.getProperties().getProperty((String)value)); } System.out.println("**************maps集合注入*****************"); for(String key:pcs.getMaps().keySet()){ System.out.println(pcs.getMaps().get((String)key)); } *//** * 构造器注入 *//* System.out.println("**************构造方法注入*****************"); pcs.Save(); */ /*ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext2.xml"); PersonCollects pcs =(PersonCollects) cxt.getBean("PeersonCollectionBean");
(3)使用内部bean注入
<!--2.使用内部bean注入,此bean不能用于其他bean -->
<!-- <bean id="PersonServiceref" class="cn.itcast.service.imp.PersonServiceBeanref"> <property name="persondao" > <bean id="PersonDaoBean" class="cn.itcast.dao.imp.PersonDaoBean"></bean> </property> <property name="name" value="张鑫"></property> <property name="id" value="88"></property> <property name="age" value="18"></property> </bean>
缺点:bean多时,xml冗长
2.使用Field注入(用于注解方式)
配置文件导入:
xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation中导入:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
说明:
bean节点下的:
<!-- 注解注入 -->
<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,
RequestAnnotationBeanPostProcessor
注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar
@Autowired与@Resoure注解
在java代码中使用@Autowired或是@Resource注解方式进行装配1.@Autowired默认按类型装配
(1)用于类属性上
@Autowired
public PersonDao persondao;
(2)用于setter方法上
@Autowired
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
说明:
@Autowired注解是按照类型装配依赖对象。
默认情况下他要求依赖对象必须存在,如果允许为null值,可以设置它的required属性为false。
如果我们想使用按字段名称装配,可以结合@Qualifier注解一起使用
@Autowired@Qualifier("PersonDaoBean")
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
2.@Resource:默认按名称装配,当找不到与名称匹配的bean才会按照类类型装配。
.@Resource和@Autowired一样,也可以标注在字段或是属性的setter方法上,但他默认按照名称装配。
名称可以通过@Resource的name属性指定。如果没有指定name属性,当注解标注在字段上,即默认取字段的名称,作为bean名称寻找依赖对象;当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Resource(name="PersonDaoBean") //@Resource
public PersonDao persondao;
@Resource(name="PersonDaoBean") //@Resource
public void setPersondao(PersonDao persondao) {this.persondao = persondao;}
注意:
如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时,@Resource注解会回退到按照类型装配。但一旦指定了name属性,就只能按照名称装配。
二、自动装配 不推荐使用
如:
<bean id=" " class=" " autowire=“byType”/>
autowire属性:
(1)byType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。
(2)byName:按名称装配,可以根据属性的名称,在容器中寻找跟该名称匹配的bean。如果没有找到,即属性值为null。
(3)constructon与byType的方式类似,不同之处在于它应用与构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常。
(4)autodetect:通过bean类的自省机制(introspection)来决定是使用constructon还是使用byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
建议:
自动装配:开发人员将无法预见最终的装配结果。
相关文章推荐
- spring学习笔记3——注入依赖对象
- spring.net学习笔记1--依赖对象注入
- spring in action 学习笔记(二)通过构造器注入对象的引用
- (学习笔记)spring入门之Bean的依赖注入
- Spring学习笔记(二)——注解创建对象和注入属性
- java学习笔记之Spring依赖注入和控制反转
- 【Spring学习笔记】依赖注入
- Spring学习笔记——关于Spring注解扫描不能注入new对象问题
- Spring学习笔记(6)----编码剖析Spring依赖注入的原理
- Spring4学习笔记----Spring的依赖注入详解
- Spring学习笔记(5)----依赖注入的简单实现
- 微软企业库4.1学习笔记(五)对象创建和依赖注入方法
- spring 依赖注入DI-个人学习笔记
- Spring2.5学习笔记1-控制反转-依赖注入类型
- Spring学习笔记之泛型依赖注入
- 微软企业库4.1学习笔记(五)对象创建和依赖注入方法
- Spring学习笔记001 - 依赖注入
- Spring学习笔记----依赖注入的简单实现
- Spring通过容器获取配置对象及事件注入(学习笔记二)
- Spring学习笔记之泛型依赖注入