spring学习笔记3--依赖注入对象
来源:互联网 发布:四川网络大学考试平台 编辑:程序博客网 时间:2024/04/20 08:23
手工注入扩展:http://blessht.iteye.com/blog/1162131
前言:自己在复习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 //自定义注解//@Resourcepublic 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学习笔记3——注入依赖对象
- Spring 学习笔记 ----依赖注入
- [学习笔记]Spring依赖注入
- Spring学习笔记 依赖注入
- 【Spring学习笔记】依赖注入
- spring.net学习笔记1--依赖对象注入
- Spring注入依赖对象
- Spring注入依赖对象
- Spring 4 学习笔记3:依赖注入(DI)
- Spring学习笔记(1)---依赖注入
- Spring 学习笔记 - IOC/依赖注入
- Spring学习笔记(8)-----------依赖注入
- spring学习笔记(4)依赖注入详解
- spring 依赖注入DI-个人学习笔记
- 【Spring学习笔记二】-理解依赖注入
- spring学习笔记 依赖注入详解
- Spring学习笔记(三)依赖注入
- Java异常
- 电子电路基础知识点滴
- windows 如何查看端口占用情况?
- 多媒体文件类型与编码格式
- javascript写在<head>和<body>里的区别
- spring学习笔记3--依赖注入对象
- 关于oracle中的高水位线问题
- 黑马程序员_多线程2
- 二叉树
- hdu1014(随机数)
- 我的联系方式!
- Google Protobuf 使用介绍
- 使用fastcgi_finish_request提高页面响应速度
- 在JSP中如何包含一个静态页面