zoukankan      html  css  js  c++  java
  • Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言

    在写完Spring第二和第三篇后,去读了Spring In Action这本书…发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写…

    通过java代码配置bean

    由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。显示装配有两种方式

    • 通过java代码装配bean
    • 通过XML装配bean

    Spring In Action作者首推使用自动装配的功能,而后是通过java代码配置bean,最后才用XML文件配置的方式..

    那么怎么通过java代码来配置Bean呢??

    • 编写一个java类,使用@Configuration修饰该类
    • 被@Configuration修饰的类就是配置类

    编写配置类

    
        @org.springframework.context.annotation.Configuration
        public class Configuration {
    
        }
    

    使用配置类创建bean

    • 使用@Bean来修饰方法,该方法返回一个对象。
    • 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
    • Spring内部会将该对象加入到Spring容器中
    • 容器中bean的ID默认为方法名
    
    
    
    @org.springframework.context.annotation.Configuration
    public class Configuration {
    
        @Bean
        public UserDao userDao() {
    
            UserDao userDao = new UserDao();
            System.out.println("我是在configuration中的"+userDao);
            return userDao;
        }
    
    }
    • 测试代码:要使用@ContextConfiguration加载配置类的信息【引入test包】
    
    package bb;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    
    /**
     * Created by ozc on 2017/5/11.
     */
    //加载配置类的信息
    @ContextConfiguration(classes = Configuration.class)
    public class Test2 {
    
        @Test
        public void test33() {
    
            ApplicationContext ac =
                    new ClassPathXmlApplicationContext("bb/bean.xml");
    
            UserDao userDao = (UserDao) ac.getBean("userDao");
    
            System.out.println(userDao);
        }
    }
    

    这里写图片描述


    使用配置类实现对象依赖

    Spring in Action有两种方法(但我测试不出来,如果会的请在评论去告诉我.….)

    • 第一种(测试不出来)
    
    import org.springframework.context.annotation.Bean;
    
    @org.springframework.context.annotation.Configuration
    public class Configuration {
    
        @Bean()
        public UserDao userDao() {
    
            return new UserDao();
        }
    
        @Bean
        public UserService userService() {
    
            //直接调用@bean的方法
            return new UserService(userDao());
        }
    
    }

    • 第二种(测试不出来)
    
    import org.springframework.context.annotation.Bean;
    
    @org.springframework.context.annotation.Configuration
    public class Configuration {
    
        @Bean()
        public UserDao userDao() {
    
            return new UserDao();
        }
    
        @Bean
        public UserService userService(UserDao userDao) {
    
            //通过构造函数依赖注入
            return new UserService(userDao);
        }
    
    }
    

    这里写图片描述


    • 如果我直接通过构造器传入的话,那么报错了
    
    import org.springframework.beans.factory.annotation.Autowire;
    import org.springframework.context.annotation.Bean;
    
    @org.springframework.context.annotation.Configuration
    public class Configuration {
    
        @Bean()
        public UserDao userDao() {
    
            return new UserDao();
        }
    
        @Bean(autowire = Autowire.BY_TYPE)
        public UserService userService(UserDao userDao) {
    
            return new UserService(userDao);
        }
    
    }

    这里写图片描述


    • 我测试中只有通过这种方法才能拿到userDao的引用。
    public class Configuration {
    
        @Bean()
        public UserDao userDao() {
    
            return new UserDao();
        }
    
        @Bean(autowire = Autowire.BY_TYPE)
        public UserService userService() {
    
            return new UserService(userDao());
        }
    
    }
    
    

    这里写图片描述


    当然了,最简单直观的方法还有一种:在UserService中加入setUser()方法,那么只要set进去就行了..

    • UserService
    
    public class UserService {
    
        private UserDao userDao ;
    
        public UserService() {
        }
    
        public UserService(UserDao userDao) {
    
    
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    • Config
    
    import org.springframework.context.annotation.Bean;
    
    @org.springframework.context.annotation.Configuration
    public class Config1 {
    
        @Bean(name = "userDao")
        public UserDao userDao() {
    
            return new UserDao();
        }
    
    
        @Bean(name="userService")
        public UserService userService() {
    
            UserService userService = new UserService();
    
            userService.setUserDao(userDao());
    
            return userService;
        }
    
    }

    这里写图片描述


    c名称空间

    我们在使用XML配置创建Bean的时候,如果该Bean有构造器,那么我们使用<constructor-arg>这个节点来对构造器的参数进行赋值…

    <constructor-arg>未免有点太长了,为了简化配置,Spring来提供了c名称空间,其实和我们之前讲到的p名称空间是一样的…

    要想c名称空间是需要导入xmlns:c="http://www.springframework.org/schema/c"

    
        <bean id="userService" class="bb.UserService" c:userDao-ref="">
    
        </bean>
    

    c名称空间有个缺点:不能装配集合,当我们要装配集合的时候还是需要<constructor-arg>这个节点

    装载集合

    如果对象上的属性或者构造函数拥有集合的时候,而我们又需要为集合赋值,那么怎么办?

    • 在构造函数上,普通类型
    
        <bean id="userService" class="bb.UserService" >
            <constructor-arg >
                <list>
                    //普通类型
                    <value></value>
                </list>
            </constructor-arg>
        </bean>
    • 在属性上,引用类型
    
         <property name="userDao">
    
             <list>
                 <ref></ref>
             </list>
         </property>

    JavaConfig与XML组合

    我们有的时候可能会两种配置混合时候…

    如果JavaConfig的配置类是分散的,我们一般再创建一个更高级的配置类(root),然后使用@Import来将配置类进行组合

    如果XML的配置文件是分散的,我们也是创建一个更高级的配置文件(root),然后使用来将配置文件组合

    在JavaConfig引用XML

    • 使用@ImportResource()

    在XML引用JavaConfig

    • 使用<bean>节点就行了

  • 相关阅读:
    php rewrite 简单
    第十六章 复杂的抽像类结构 简单
    php数学函数 简单
    PHP PCLZIP压缩类的学习笔记 简单
    windows实战Git环境配置msysGit+TortoiseGit 简单
    配置php.ini支持图片exif信息 简单
    使用PHP连接POSTGRES数据库 简单
    jQuery Ajax 实例 全解析 简单
    第十六章 多态性(一) 简单
    C#委托与事件
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202950.html
Copyright © 2011-2022 走看看