• JAVA入门[13]-Spring装配Bean


    一、概要

    Sping装配bean主要有三种装配机制:

    • 在XML中进行显式配置。
    • 在Java中进行显式配置。
    • 隐式的bean发现机制和自动装配。

    原则:

    建议尽可能地使用自动配置的机制,显式配置越少越好。当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig。最后,只有当你想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。

    二、自动装配

    Spring从两个角度来实现自动化装配:

    • 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
    • 自动装配(autowiring):Spring自动满足bean之间的依赖

    1.组件扫描

    @Component注解:添加注解表明该类会作为组件类,并告知Spring要为这个类创建bean。

    package bean;
    import org.springframework.stereotype.Component;
    @Component public class Category { private int cateId; public int getCateId() { return this.cateId; } public void setCateId(int id) { this.cateId = id; } @Override public String toString() { return " 商品类型 id=" + this.cateId; } }

      

    2.启用组件扫描两种方式:

    ①使用XML来启用组件扫描,在applicationContext.xml配置:

    <context:component-scan base-package="autowire.bean"></context:component-scan>
    

      

    单元测试:

    @ContextConfiguration(locations = "classpath*:applicationContext.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    
    public class testAutowireXml {
        @Autowired
        private Category category;
    
        @Test
        public void TestXmlBean() {
            Assert.assertNotNull(category);
        }
    }
    

      

    ②使用java配置

    前面的bean类不做任何调整,通过@ComponentScan注解实现自动扫描。例如新建java配置文件BeanConfig.java

    @Configuration
    @ComponentScan(basePackageClasses = bean.Category.class)
    public class BeanConfig {
    }
    

      

    单元测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = BeanConfig.class)
    public class testAutowireJava {
    
        @Autowired
        private Category category;
    
        @Test
        public void categoryNotNull() {
            Assert.assertNotNull(category);
        }
    }
    

      

    三、JavaConfig装配bean

    上面的BeanConfig就是用java config方式实现的。java Config也是一个java类,但它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中,通常会将JavaConfig放到单独的包中。

    创建java config关键是使用@Configuration ,表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

    在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。

    我们新建一个config文件JavaConfig.java,是在BeanConfig.java基础上去掉@ComponentScan注解,并添加category()返回Category实例。

    @Configuration
    public class JavaConfig {
    
        @Bean
        public Category category(){
            return new Category();
        }
    }
    

      

    单元测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = JavaConfig.class)
    public class testJavaConfig {
    
        @Autowired
        private Category category;
    
        @Test
        public  void testCategoryBean(){
            Assert.assertNotNull(category);
        }
    }
    

      

    四、XML方式装配bean

    JAVA入门[3]—Spring依赖注入这篇笔记中包含了如何通过xml方式装配bean实例。

    1.构造器传参

    ①首先为Category添加构造函数:

    public class Category {
        private int cateId;
        public Category() {
        }
    
        public Category(int id) {
            cateId = id;
        }
    
        public int getCateId() {
            return this.cateId;
        }
    
        public void setCateId(int id) {
            this.cateId = id;
        }
    
        @Override
        public String toString() {
            return " 商品类型 id=" + this.cateId;
        }
    }
    

      

    ②applicationContext添加bean节点,为constructor-arg设置Id或者index。

     <bean class="bean.Category">
        <constructor-arg name="id" value="100"></constructor-arg>
     </bean>

    <bean class="bean.Category">
      <constructor-arg index="0" value="100"></constructor-arg>
    </bean>
    

      

    ③单元测试:

    @ContextConfiguration(locations = "classpath*:applicationContext.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    public class testAutowireXml {
    
        @Autowired
        private Category category;
    
    ……
    
        @Test
        public void testId(){
            Assert.assertEquals(100,category.getCateId());
        }
    }
    

      

    ④c-命名空间

    这种语法用起来简化一些。

    Image

    调整②中的bean节点:

    <bean class="bean.Category" c:_0="100"></bean>

    <bean class="bean.Category" c:id="100"></bean>

    2.设置属性 :

    ①通过为bean设置property实现属性

    <bean class="bean.Category" >
          <property name="cateId" value="100"></property>
    </bean>
    

      

    ②p-命名空间

    前面的bean配置可以简化为:

    <bean class="bean.Category" p:cateId="100"></bean>
    

      

    Image

    五、属性占位符

    Spring支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${ ... }”包装的属性名称。

    config.properties:

    cateid=100
    

      

    spring-config.xml:

     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:properties/config.properties</value>
                </list>
            </property>
        </bean>
    
        <bean class="bean.Category" p:cateId="${cateid}"></bean>

    示例代码https://github.com/cathychen00/learnjava/tree/master/DemoBean

  • 相关阅读:
    tp3.2和Bootstrap模态框导入excel表格数据
    PHPEXCEL导入导出
    Yar请求数据接口
    php函数
    Linux常用操作命令
    PHP读取excel表格,和导出表格
    PHP 查找二维数组中是否有指定字符串的字段
    下载百度网盘大文件
    thinkPHP写txt日志文件
    PHP接收post请求,不是空数组就是没值,怎么办!
  • 原文地址:https://www.cnblogs.com/janes/p/6868149.html
Copyright © 2020-2023  润新知