Spring 学习

IoC 容器

IoC (Inversion of Control,即控制反转): IoC容器是 Spring 框架的核心。容器负责创建和查找依赖对象,由容器配置bean对象,并管理他们的整个生命周期(从创建到销毁)。
DI (Dependency Injection,即依赖注入):组件之间依赖关系由容器在运行期决定,由容器动态的将某个依赖关系注入到组件之中。

Spring IoC 容器

 

Spring 提供了以下两种不同类型的容器:BeanFactory 容器 和 ApplicationContext 容器。Application Context是BeanFactory的子接口,也被称为 Spring上下文。ApplicationContext 容器包括 BeanFactory 容器的所有功能。所以通常建议使用ApplicationContext。BeanFactory 较为轻量,可用于如移动设备或基于 applet 的应用程序。

1. BeanFactory 接口实现:
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("Beans.xml"));

2. ApplicationContext 接口实现:
(1) FileSystemXmlApplicationContext:ApplicationContext context = new FileSystemXmlApplicationContext ("C:/config/Beans.xml");
(2) ClassPathXmlApplicationContext: ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
(3) WebXmlApplicationContext:

 

ServletContext servletContext = request.getSession().getServletContext(); 
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext ); 

两者装载bean的区别

  • BeanFactory:在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
  • ApplicationContext:在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;

Bean的作用域

作用域描述
singleton

在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值

prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() 
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境

 

 

 

 

 

 

Bean的生命周期

Bean的定义——Bean的初始化——Bean的使用——Bean的销毁 。可以在配置Bean时指定初始化和销毁方法。

<bean id="userService" class="com.spring.UserService" init-method="init" destroy-method="destroy">
     <property name="userDao" ref="userDao"/>
</bean>

依赖注入

1. 构造函数和setter依赖注入

 

// 构造函数的依赖注入
public class UserService {
    private UserDao userDao;
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}
<bean id="userService" class="com.test.UserService">
    <constructor-arg ref="userDao"/>   // 可以指定参数属性 index="0"或type="int"
</bean>

// setter的依赖注入
public class UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
    }
}
<bean id="userService" class="com.spring.UserService">
    <property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.spring.UserDao"/>
View Code

 

2. 集合属性注入

<bean id="user" class="com.test.User">
    <property name="addressList">
        <list>
            <value>Beijing</value>
            <value>Shanghai</value>
        </list>
    </property>
    <property name="addressMap">
        <map>
            <entry key="1" value="Beijing"/>
            <entry key="2" value="Shanghai"/>
        </map>
    </property>
</bean>
View Code

自动装配

在Spring框架,可以用 auto-wiring 功能会自动装配Bean。要启用它,只需要在 <bean>定义“autowire”属性。在Spring中,支持 5 自动装配模式。
1. 基于XML的自动装配
(1) no – 缺省情况下,自动配置是通过“ref”属性手动设定
<bean id="userService" class="com.spring.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.spring.UserDao">
</bean>

(2) byName – 根据属性名称自动装配。
<bean id="userService" class="com.spring.UserService" autowire="byName"/>

(3) byType – 按数据类型自动装配。
<bean id="userService" class="com.spring.UserService" autowire="byType"/>

(4) constructor – 在构造函数参数的byType方式。
<bean id="userService" class="com.spring.UserService" autowire="constructor"/>

(5) autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。
<bean id="userService" class="com.spring.UserService" autowire="autodetect"/>

2. 基于注解的自动装配

@Autowired: 在Spring中,可以在setter方法,构造函数或字段上使用@Autowired注解,自动装配Bean。
@Required: 当@Autowired无法找到匹配的Bean装配,它会抛出异常。可以通过设置 @Autowired 的required=false来禁用此检查功能。
@Qualifier: 可以指定bean的id, 当bean没有指定id时,id默认为类名首字母小写

public class UserService {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    
    // @Autowired(required=false)
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
 
 
参考原文:https://www.yiibai.com/spring/spring-auto-wiring-beans-in-xml.html

 

posted @ 2019-07-05 18:39  安小  阅读(126)  评论(0编辑  收藏  举报