Spring总结2—IOC
2016-04-24 16:31
489 查看
一、IOC实现
IoC有多种实现方法,其中,Spring是通过一种名为DI(Dependency Injection,即依赖注入)的方法实现的。用夏昕先生的话来讲,”所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。”在Spring中,上面所说的容器一般是一种配置文件(.Xml等类型的文件)。通过使用DI,当组件之间关系发生变化时,我们只需要修改系统中相关的配置文件,不需要改动我们的代码,这既减少了我们的程序维护量,又提高了我们程序的可重用性。
DI主要有三种实现方式:接口注入、设值注入、构造注入,下面分别加以介绍:
1、接口注入:该方式利用接口将调用组件和实现组件相分离。(用的很少)
2、构造注入:即通过构造函数完成依赖关系的设定(用的不多)
public UserService(UserDAO userDAO){ this.userDAO = userDAO; }
在该模式中,依赖关系是通过类构造函数建立的,容器通过调用类的构造方法,将其所需的依赖关系注入其中
<bean id="u" class="com.cdd.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="com.cdd.service.UserService" scope="prototype" autowire="byType" init-method="init" destroy-method="destroy"> <!--constructor注入(构造器注入必须有构造方法:用的很少)--> <constructor-arg> <ref bean="u"/> </constructor-arg> </bean>
3、设值注入:是spring中应用最广泛的DI模式,与其它模式相比,该模式更为直观、自然。该模式主要通过类的setter方法来完成依赖关系的设置(用的最多)。
private UserDAO userDAO; //构造器注入方法 ,配置文件中用 <constructor-arg><ref bean=""/></constructor> /*public UserService(UserDAO userDAO){ this.userDAO = userDAO; }*/ //set方法注入:<property name="" ref =""></property> public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }
上面的实参userName和password的值由容器(spring中的相关配置文件)定义,并在运行期间由该容器提供。
二、IOC xml配置—setter注入
根据注入内容的不容分为多种情况。(1) 注入简单属性(String和8中基本类型)
<beans> <bean id=”BeanId” class=”classpath” autowire=” ” dependency-check=” ”> <property name=”parameterName”> <value>parameterValue</value> </property> </bean> </beans>
对于基本类型,Spring容器会自动作类型转换,以便赋值。
(2) 注入对象
<bean> <ref local=”BeanId”> </bean>
A、让Spring容器在当前配置文件中找到相应的Bean,并调用set方法,注入该Bean。
B、将一个Bean的定义嵌套在另一个Bean中(可读性差),被嵌套的Bean不能采用getBean()返回
C、采用
<ref bean=” ”>搜索多个配置文件来注入。
整体案例如下:
<bean id="u" class="com.cdd.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="com.cdd.service.UserService" scope="prototype" autowire="byType" init-method="init" destroy-method="destroy"> <!--setter注入--> <property name="userDAO" ref="u"></property> </bean>
(3) 注入集合类型
① Set
Set中存放字符串,对象,集合,不允许重复
② List
List中可以放入字符串,对象,List
③ Map
Map 有子元素来存取key,value,key只能为String
④ Properties
Properties有子元素
三、Bean的关键属性
1、name和Id 元素id的命名要满足XML对ID属性命名规范 必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号
使用name属性,就可以使用很多特殊字符 ,早期在struts1 和 spring整合,name中含有/ ,使用id会报错
注:如果元素没有id只有name ,name 属性值可以作为id 使用
2、scope属性
1. scope=”singleton” 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)(通常需要单例的就可应用Spring开发)
2. scope=”prototype” 多例 ,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时
,相当于执行new XxxBean()
3. scope=”request” 用于web开发,将Bean放入request范围
,request.setAttribute(“xxx”) , 在同一个request 获得同一个Bean
4. scope=”session” 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
5. scope=”globalSession” 一般用于Porlet应用环境 , 分布式系统存在全局session概念,如果不是porlet环境,globalSession 等同于Session
注:在开发中主要使用 scope=”singleton” scope=”prototype”
3、自动装配 autowire (容易出错,尽量少用)
装配方式:byName,byType,autodetect,constructor
autowire=“byName”:按照名称匹配,按照Bean的Id与属性的名称进行匹配
注:自动装配与手动装配可以结合使用,手动装配会覆盖自动装配。
autowire=“byType”:按照类型匹配,要注入的属性类型与配置文件中的Bean类型匹配的个数超过一个,会出错。
autowire=“antodetect”:先按照construct,后按照byType。
autowire=“constructor”:先去匹配构造器中参数类型,后与配置文件中的Bean类型匹配。
*注:如果所有的bean都用同一种,可以使用beans的属性:default-autowire
4、Bean的生命周期
在配置 元素,通过 init-method 指定Bean的初始化方法,通过 destroy-method 指定Bean销毁方法。
注:
(1)destroy-method 只对 scope=”singleton” 有效 。
(2)销毁方法,必须关闭ApplicationContext对象,才会被调用。
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); applicationContext.close();
四、IOC注解配置
1、首先在beans中引入xmlns:context=”http://www.springframework.org/schema/context”,并导入本地对应context包,配置如下:
<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"> <!--注解annotation--> <context:annotation-config /> </beans>
2、编写class,在声明上 添加 @Component
@Component("userService") //a)初始化的名字默认为类名首字母小写b)可以指定初始化bean的名字 public class UserService { }
相应的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans ...暂时省略> <!--注解annotation--> <context:annotation-config /> <!--Component:在类之上添加@Component注解,意味着是一个成员,默认名字是类名首字母小写,可以指定名字@Component("") 对于需注入的成员,添加@Resource(name=""),即可注入成功 @Service @Controller @Repository 与@Component相同意义。 --> <context:component-scan base-package="com.cdd"/> </beans>
3、@Resource
将要被注入的对象,在set方法上注解为@Resource (重点掌握)在set注入的方法上加@Resource
a)默认按名称,名称找不到,按类型,
b)可以指定特定名称
public class UserService { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } /*@Autowired public void setUserDAO(@Qualifier("u2")UserDAO userDAO) { this.userDAO = userDAO; }*/ @Resource(name="u2")//可以指定特定类型(name="") 缺省的名字将继承于字段名或者 setter 方法名:如果是字段名,它将简化或者等价于字段名;如果是 setter 方法名,它将等价于 bean 属性名) public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } //添加用户 public void add(User user){ userDAO.save(user); } }
4、其他属性—注解
@Autowired
自动装配对象,在set注入的方法上加@autowired注解:自动装配,代码如上例。
a)默认是按按类型byType
b)若要按名称byName,则加上@Qualifier(“名称”)
@Resource和@Autowired注解功能相似
@Autowired @Qualifer("userDAO") private UserDAO userDAO ; 等价于 @Resource(name="userDAO") private UserDAO userDAO ;
@Scope
Bean的作用范围
@Scope 注解 ,默认作用域 singleton 单例
@PostConstruct = init-method; @PreDestroy = destroy-method;
指定Bean的初始化方法和销毁方法(注解)
相关文章推荐
- 20145317彭垚 《Java程序设计》第8周学习总结
- JavaWeb学习总结(十二)——Session
- [疯狂Java]I/O:文件随机读写专用类——RandomAccessFile
- 浅析java语言中的垃圾回收机制
- java中链表的操作
- Java主要特性
- Java中回调函数编写
- Java中回调函数编写
- Java集合框架的总结
- java泛型类和泛型函数
- Eclipse快捷键大全
- Spring两种实现AOP的方式
- 20145118 《Java程序设计》 实验报告三
- hdoj 2002计算球体积(java)
- java field, property,variable及getField和getDeclaredField的区别
- myeclipse / eclipse 怎么定位到代码指定行
- SpringMVC实现文件上传
- 动态规划(java)
- 20145218 《Java程序设计》第8周学习总结
- 利用io流 书写简单的本地存储学生的学生管理code