您的位置:首页 > 编程语言 > Java开发

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的初始化方法和销毁方法(注解)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: