zoukankan      html  css  js  c++  java
  • Spring装配bean

    Spring配置的可选方案

      Spring提供了如下三种装配机制:

      (1)XML中显式配置

      (2)Java中显式配置

      (3)隐式的bean发现机制和自动装配

      Spring有多种方式可以装配bean建议的选择是(3>2>1因为与XML显式配置相比,Java的显式配置更加类型安全与强大。只有想要使用XML的比较便利的命名空间而Java配置没有同样的实现时,才应该使用XML

    装配Bean

    Spring装配Bean从解决下面两个问题来实现:

    1.如何生成bean?

      方式一、在类上加@Component注解,然后通过组件扫描(ComponentScan)就可以让spring扫描指定包下的的类,所有添加此注解的类将会实例化成bean然后放到Spring容器中。如果没有指定bean的名字(或者叫id,但名字似乎更好理解),默认就是类名的首字母小写,如Student类的bean名字(id)就是student

      方式二、使用XML声明一个bean时,可以使用

      <bean class=”包名.类名” />

      如果没有明确给定id,会使用这个bean的全限类名来命名。class.Student的类生成的beanid会是”class.Student#0”。其中#0”用来计数,区分相同类型的其他bean。如果后面我们需要注入这个bean,就需要指定id

      <bean id=”student” class=”class.Student” />

      方式三、通过JavaConfig声明

      在配置类上添加@Configuration,然后将要生成的Bean声明为一个个函数,添加@Bean注解,函数返回这个bean的对象,如下:

      注:1.使用JavaConfig创建的bean的ID默认与方法名相同。

        2.当一个函数添加@Bean时,Spring将会拦截所有对它的调用,并确保返回该方法所创建的bean

      

    2.如何自动注入bean?

      注:如果给一个类进行注入bean,前提是这个类也是一个bean

      方式一、当需要给这个类的某个属性进行注入时,需要在属性上添加@Autowired或@Resourcce注解。当Spring发现某个bean的属性中有@Autowired注解时,Spring会在容器中匹配满足这个属性的bean然后注入(注入规则如下图)。

      @Autowired和@Resource的区别

      与@Autowired相比,@Resource可以指定bean的名字,如果@Resource存在value,Spring直接按value值寻找bean的id注入。

       

      方式二、通过XML注入。在<bean>标签中使用<constructor-arg>来进行构造函数注入或使用<property>进行属性注入,还可以使用c-命名空间或p-命名空间来代替上述的两种标签,达到标签简化的效果(注:c-和p-命名空间不能注入集合)。

      例:

    <!-- 使用p-命名空间实现引用注入 -->
        <bean id="student" class="riskGame.Student"
            p:name="xiaowang"
            p:parent-ref="parent">
            <!-- 使用<property>实现集合注入 -->
            <property name="books">
                <list>
                    <ref bean="book1"></ref>
                    <ref bean="book2"></ref>
                </list>
            </property>
        </bean>
    
        <!-- 使用c-命名空间指定属性名实现构造注入 -->
        <bean id="book1" class="riskGame.Book"
              c:name="数学"
              c:price="50.00">
        </bean>
        <!-- 使用c-命名空间指定下标实现构造注入 -->
        <bean id="book2" class="riskGame.Book"
              c:_0="语文"
              c:_1="50.00">
        </bean>
        <!-- 使用p-命名空间指定属性名实现属性注入 -->
        <bean id="parent" class="riskGame.ParentInfo"
            p:name="laowang"
            p:addr="beijin">
        </bean>
    

      方式三、通过JavaConfig,实现函数注入:

      

    //说明此类是一个配置类
    @Configuration
    //通过组件扫描,自动生成Bean
    @ComponentScan(basePackages = {"riskGame","task"})
    public class RiskConfig2 {
        @Bean
        //如果函数有形参,Spring会自动根据形参注入对应的bean
        public Soldier soldier(Weapon sword,Task fightDrogon){
            Soldier soldier=new Soldier();
            //通过set方法注入
            soldier.setSword(sword);
            soldier.setTask(fightDrogon);
            return soldier;
        }
        @Bean//通过构造函数注入
        public Soldier soldier2(Weapon sword,Task fightDrogon){
            return new Soldier(sword,fightDrogon);
        }
        @Bean
        public Task fightDrogon(){
            return new FightDrogon();
        }
        @Bean
        public Weapon sword(){
            return  new Sword();
        }
    }
  • 相关阅读:
    Linux 文件管理篇(一 档案读写)
    Linux 任务管理篇(一)
    Mysql 视图简介
    MySql 使用正则表达式查询
    mysql 插入、更新与删除数据
    mysql 多表查询
    mysql 单表查询
    Java抽象类与接口
    maven小结
    shiro 进行权限管理 —— 使用BigInteger进行权限计算获取菜单
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/7699946.html
Copyright © 2011-2022 走看看