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:因作者能力有限,如有误还请谅解

猜你喜欢

转载自www.cnblogs.com/WHL5/p/9044964.html