zoukankan      html  css  js  c++  java
  • Spring框架深入(一)--bean的装配

    基本装配使用

      1、基于配置文件:

      在配置文件中配置一个bean

    <bean id="实例的名字,是唯一的" class="实例的类">
        <property name="基本类型属性名" value="值"></property>
        <property name="引用属性名" ref="该类对应的实例ID"></property>
    </bean>

      2、基于注解的方式:

      包括实例化的注解,依赖注入的注解,以及全局扫描包的注解;

      博主之前写过一篇关于注解的博文,这里就不赘述了;有需要的可以前往查看:注解的使用

      3、构造器注入和属性注入

      (1)构造器注入:基于构造函数注入;如:

    @Autowired
    public User(@Value("whl")String name, @Value("whl")String pwd) {
        super();
        this.name = name;
        this.pwd = pwd;
        System.out.println("有参");
    }

        在配置文件中配置构造器:

      

      (2)属性注入:调用无参构造函数创建实例后,基于setter方法注入,如:

    @Component
    public class User {
        private String name;
        private String pwd;
        public String getName() {
            return name;
        }
        @Value("whl")
        public void setName(String name) {
            this.name = name;
            System.out.println("name,setter");
        }
        @Value("whl")
        public void setPwd(String pwd) {
            this.pwd = pwd;
            System.out.println("pwd,setter");
        }
    }

      同时,在测试类中配置扫描包

    @Configuration
    @ComponentScan(basePackages="test")
    public class Test {
        public static void main(String[] args) {
            ApplicationContext ac = new AnnotationConfigApplicationContext("Test.class");
            User user = (User) ac.getBean("user");
            System.out.println("user");
        }
    
    }    

      setter注入和构造器注入对比

     

    实现

    时效性

    灵活性

    构造函数

    Setter注入

    Setter访问器

    无参

    构造器注入

    有参构造函数

    匹配对应的有参构造函数

      4、集合属性注入

      (1)、list属性注入,在配置文件中进行配置;如一个部门有多个人员:

    <bean id="emp1" class="injection.Emp">
        <property name="name" value="emp1"></property>
    </bean>
    <bean id="emp2" class="injection.Emp">
        <property name="name" value="emp2"></property>
    </bean>
    <bean id="emp3" class="injection.Emp">
        <property name="name" value="emp3"></property>
    </bean>
    
    <bean id="dept" class="injection.Dept">
        <property name="name" value="研发部"></property>
        <property name="emplist">
            <list>
                <ref bean="emp1"/>
                <ref bean="emp2"/>
                <ref bean="emp3"/>
            </list>
        </property>
    </bean>

        注:如果list是基本数据类型,就不用 ref ,可以直接用 value ;

      (2)、Map属性注入,同样的,在配置文件中进行配置

    <bean id="emp1" class="injection.Emp">
        <property name="name" value="emp1"></property>
    </bean>
    <bean id="emp2" class="injection.Emp">
        <property name="name" value="emp2"></property>
    </bean>
    <bean id="emp3" class="injection.Emp">
        <property name="name" value="emp3"></property>
    </bean>
        
    <bean id="dept" class="injection.Dept">
        <property name="empMap">
            <map>
                <entry key="1" value-ref="emp1"></entry>
                <entry key="2" value-ref="emp2"></entry>
                <entry key="3" value-ref="emp3"></entry>
            </map>
        </property>
    </bean>

      5、内部bean

      概念:在bean的内部装配一个只属于他的bean;

      外部bean:可以供多个bean来装配;

      内部bean示例:

    <bean id="devEmp1" class="injection.Emp">
        <property name="name" value="研发人员1"></property>
        <property name="mgr">
            <bean id="mgr" class="injection.Mgr">
                <property name="name" value="经理"></property>
            </bean>
        </property>
    </bean>

        mgr就是一个内部bean,它只能被DevEmp1所使用

      外部bean示例:

    <bean id="mgr" class="injection.Mgr">
        <property name="name" value="经理"></property>
    </bean>
    <bean id="devEmp1" class="injection.Emp">
        <property name="name" value="研发人员1"></property>
        <property name="mgr" ref="mgr"></property>
    </bean>
        
    <bean id="devEmp2" class="injection.Emp">
        <property name="name" value="研发人员2"></property>
        <property name="mgr" ref="mgr"></property>
    </bean>

        这个时候 mgr就是一个外部bean,他可以被devEmp1和devEmp2所共同使用

      6、bean的继承

      在配置中,子类可以直接继承父类的属性的值;

      在bean中使用parent属性,继承的是对象中属性的值;

        如:

    <bean id=”baseDao”>
        <property name=”sqlSessionFactory” ref=” sqlSessionFactory”></property>
    </bean>
    <bean id=”UserDao” parent=”baseDao”></bean>

        利用继承,替代了:

    <bean id=”UserDao” >
        <property name=”sqlSessionFactory” ref=” sqlSessionFactory”></property>
    </bean>

        利用继承,可以降低我们配置bean时的代码量;

      7、自动装配

      Spring是一个巨大的容器,里面有很多实例,自动根据实例的属性和实例直接的匹配关系实现属性赋值

      byName:根据属性名和实例的id匹配

      byType:根据属性类型和实例的类型进行匹配

      基于注解自动装配:

        @AutoWired:

          属于Spring的注解

          只通过byName自动注入

          与@Qualifie结合的时候,通过byName实现自动注入

        @Resource:

          属于Java自身的注解

          先byName自动注入,再byType自动注入

      8、属性编辑器

      概念:类型转换器,Spring在做属性赋值的时候,将字符串类型转换成其他类型(如:Date)的操作,自定义属性编辑器;

      实现步骤:

        创建自定义属性编辑器类:extends PropertyEditorSupport

    public class DatePropertyEditor extends PropertyEditorSupport {
        /*
         * text:输入的String类型的值
         * 转成property对应的类型
         * */
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            // TODO Auto-generated method stub
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
            try {
                this.setValue(sdf.parse(text));//text转成Date类型
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

        在配置文件中配置属性编辑器

    <!-- 配置属性编辑器:代理模式(key)——转换类(value) -->
    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="customEditors">
            <map>
                <entry key="java.util.Date" value="injection.DatePropertyEditor"></entry>
            </map>
            </property>
    </bean>

        最后,它会自动使用,实现属性注入;

    PS:因作者能力有限,如有误还请谅解

  • 相关阅读:
    vs2008支持ajax extender控件
    ComponentArt控件分析之CallBack(1)
    asp.net控件开发技巧(2)关闭基类不必要的功能
    asp.net控件开发技巧(1)使用HtmlTextWriter类规范输出标签
    开了一论坛,专门讨论控件技术
    出来透个气
    道歉
    Kubuntu 9.10 Karmic Koala 预览
    让Nginx 的URL目录自动加斜线”/”
    Nginx的Rewrite正则表达式,匹配非某单词
  • 原文地址:https://www.cnblogs.com/WHL5/p/9044964.html
Copyright © 2011-2022 走看看