zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python join()阻塞的用法
    python远程批量执行命令
    python多进程,以及进程池并发
    python生产者消费者模型
    python如何保证多个线程同时修改共享对象时不出错!
    python多线程,多进程
    python paramiko模拟ssh登录,实现sftp上传或者下载文件
    python初识1
    验证码的作用和实现原理
    网络应用软件结构-----CS与BS结构(网络基本知识小结)
  • 原文地址:https://www.cnblogs.com/anxiao/p/11140067.html
Copyright © 2011-2022 走看看