zoukankan      html  css  js  c++  java
  • spring核心技术IOC,DI

    在介绍Spring中IOC之前,先说说Spring的优势有哪些。首先1.方便解耦,简化开发:就是说将对象间的依赖关系交给Spring进行控制,避免了编码造成的过度耦合。2.AOP编程的支持:方便进行切面编程。3.声明式事务的支持:进行事务的管理,提高开发效率和质量。4.方便程序的测试:可以用非容器的依赖的编程方式进行几乎所有的测试工作。5.方便集成各种优秀的框架:Spring降低各种框架的难度,提供各种框架的支持。6.降低API的难度:Spring对(JDBC,javaMail,远程调用等)进行了薄薄的封装层,使这些API使用难度大大降低。

    以上讲述了Spring的好处,接下来说说Spring的核心技术IOC。官方是这样介绍IOC的:控制反转,表示将对象的创建权利反转给Spring框架。它主要解决的是“程序耦合性高的问题”。以前创建对象,直接new,利用反射,调用对象克隆,运用序列化手段调用java.io.ObjectInputStream 对象的 readObject()方法。IOC已经帮我们解决了这个问题,创建对象的动作直接交给Spring,它相当于一个大容器,将已经创建好的对象放到容器中,需要那个对象,直接到容器中去取就可以了。

    Spring提供了2个工厂接口:1.ApplicationContext接口 :该接口可以获得具体的Bean对象,而且这个接口有2个具体的实现类分别是ClassPathXmlApplicationContext:加载类路径下的Spring配置文件   FileSystemXmlApplicationContext:加载本地磁盘下的Spring配置文件。2.BeanFactory:是Spring框架早期的创建Bean对象工厂接口。代码如下:

    看如下代码:

        @Test
        public void test() {
            
    //        创建Spring工厂,IOC容器
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            //BeanFactory ac=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));  //Beanfactory创建对象   
            UserDao userDao =(UserDao) ac.getBean("userDao");
            
            userDao.save();
            
        }

    对于以上两个接口还是有区别的,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean。而applicationContext.xml中就会创建具体的Bean对象,除此之外具有事件传递,Bean自动装配,各种不同的应用层的Context实现。对于IOC入门学习者,了解一下Spring核心配置文件的标签。id属性:id属性是Bean的唯一标识  class属性是Bean的全路径名  scope属性代表Bean的作用范围,其中single:单例(默认值)  prototype:多例   request:应用在Web应用层,将创建的对象存入到request域中  session:应用在web应用中,将创建的对象存入到session中  globalsession:应用在porlet环境下使用,将创建的对象存入到全局的session中。注意:当设置为多例时,每次getBean时,都会重新实例化。

    init-method属性:当Bean被载入到容器的时候调用init-method指定的方法。destroy-method属性:当Bean从容器中删除的时候调用destroy-method属性指定的方法,想查看destroy-method的效果,必须满足scope=singleton有效,Web容器会自动调用,需要手动ClassPathXmlApplicationContext的close方法。

    public class UserDaoImpl implements UserDao{
    
        public void save() {
            System.out.println("持久层,用户保护");
        }
        
        public void firstInit(){
            System.out.println("初始化方法启动");
        }
        
        public void lastdestroy(){
            System.out.println("销毁方法启动");
        }
    
    }

    核心配置文件的配置如下:

     <bean id="userDao" class="com.user.dao.impl.UserDaoImpl" init-method="firstInit" destroy-method="lastdestroy"></bean>

    测试代码:

        @Test
        public void test() {
            
    //        创建Spring工厂,IOC容器
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            
            UserDao userDao =(UserDao) ac.getBean("userDao");
            
            userDao.save();
            
    //        手动关闭close,才能调用destroy-method方法
            ((ClassPathXmlApplicationContext)ac).close();
            
        }

     2.依赖注入DI:在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!可以通过构造(提供构造方法)注入,set注入(提供Set方法)等,除了以上常用注入以外,还有特殊类型的注入。比如数组或list注入,Map注入,properties注入。特殊类型的注入式放在Bean中注入的,这里实体类需要提供属性,并且提供set方法,以下分别列出其注入的代码:

    <!-- 构造方法注入 -->
            <bean id="car" class="com.domain.Car">
                <constructor-arg name="name" value="大奔"></constructor-arg>
                <constructor-arg name="price" value="1234.00"></constructor-arg>
            </bean>
    
    <!-- set方法注入 -->
            <bean id="people" class="com.domain.People">
                <property name="name" value="李斯特"></property>
                <property name="address" value="上海黄浦区"></property>
                <property name="car" ref="car"></property>
            </bean>
            
           <bean id="cd" class="com.domain.CollectionBean">
    <!--list注入  -->
                   <property name="list">
                       <list>
                           <value>测试1</value>
                           <value>测试2</value>
                           <value>测试3</value>
                       </list>
                   </property>
    <!-- Map注入 -->
                <property name="map">
                    <map>
                        <entry key="id" value="1"></entry>
                        <entry key="name" value="测试"></entry>
                    </map>
                </property>
    <!-- properties注入 -->
                <property name="properties">
                    <props>
                        <prop key="name">测试2</prop>
                        <prop key="age">22</prop>
                    </props>
                </property>
           </bean>
  • 相关阅读:
    shutil的一些基本用法
    python用random产生验证码,以及random的一些其他用法
    hashlib 文件校验,MD5动态加盐返回加密后字符
    python中logging日志基本用法,和进程安全问题
    用递归函数得到目录下的所有文件
    python装饰器
    列表推导式三种模式和生成器
    vue.js响应式原理解析与实现
    Promise详解
    三分钟教你同步 Visual Studio Code 设置
  • 原文地址:https://www.cnblogs.com/lichangyun/p/9663003.html
Copyright © 2011-2022 走看看