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

    <bean>元素的autowire属性负责自动装配<bean>标签定义Javabean的属性。这样做可以省去很多配置Javabean属性的标签代码,使代码整洁、美观。

        1.按bean名称装配

        <bean>元素的byName属性以属性名区分自动装配。在容器中寻找与JavaBean的属性名相同的JavaBean,并将其自动装配到Javabean中。

        【例】按Bean名称自动装配User
        创建User类

    public class User {
        private String name;
        private int age;
        private String sex;    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
    }

    创建Manger类

    public class Manger {
        private User user;
     
        public User getUser() {
            return user;
        }
     
        public void setUser(User user) {
            this.user = user;
        }
    }

    配置applicationContext.xml

    <bean id="user" class="com.shw.User">
        <property name="name" >
            <value>小强</value>
        </property>
        <property name="age" >
            <value>25</value>
        </property>
        <property name="sex" >
            <value>男</value>
        </property>
    </bean>
    <bean autowire="byName" id="manger" class="com.shw.Manger"></bean>

    创建测试类

    public static void main(String[] args) {
            //加载applicationContext.xml
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            //获取实例
            Manger manger=(Manger) context.getBean("manger");
            //调用方法
            System.out.println("姓名:"+manger.getUser().getName());
            System.out.println("年龄:"+manger.getUser().getAge());
            System.out.println("性别:"+manger.getUser().getSex());
        }

    2.按bean类型装配

    spring以bean类型区分自动装配,这次容器匹配的不再是bean名称。容器会自动寻找与JavaBean的属性类型相同的Javabean的定义,并将其注入到需要自动装配的JavaBean中。

    【例】按bean类型自动装配User
    将Manger类的User对象的属性修改为us

    public class Manger {
        private User us;
     
        public User getUser() {
            return us;
        }
     
        public void setUser(User user) {
            this.us = user;
        }
    }

    修改applicationContext.xml

    <bean autowire="byType" id="manger" class="com.shw.Manger"></bean>

    小结:

    • byname的时候,需要保证所有bean的id唯一,并且这个bean需要和注入的属性的set方法的值一致
    • bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和注入的属性的类型一致

    使用注解实现自动配置:

    jdk1.5支持的注解,Spring2.5就支持注解了!

    要使用注解须知:

    1. 导入约束 context约束

    2. 配置注解的支持:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
    </beans>

    @Autowired

    直接在属性上用即可!也可以在set方式上使用!

    使用Autowired我们可以不用使用Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在且符合名字(ByName)

    科普:

    @Nullable   字段标记了这个注解,说明这个字段可以为null
    public @interface Autowired {
        boolean required() default true;
    }

    测试代码:

    public class People {
        //如果显式的定义了AutoWired的required属性为false,说明这个对象可以为null,否则不允许为空
        @Autowired(required = false)
        private Cat cat;
        @Autowired
        private Dog dog;
        private String name;

    如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value = "xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入

    @Autowired注解

    public class people{
    @Autowired
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog")
    private Dog dog;
    private String name;
    }

    @Resource注解

    public class people{
    @Resource(name="cat")
    private Cat cat;
    @Resource
    private Dog dog;
    }

    小结

    @Resource和@Autowired的区别:

    • 都是用来自动装配的,都可以放在属性字段上
    • @Autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
    • @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!
      • 执行顺序不同:@Autowired通过byType的方式实现 @Resource默认通过byname的方式实现

    3.在spring中还有另外3种自动装配方式,通过设置autowire的不同属性值来实现。

    (1)no属性

    这是autowire采用的默认值,它采用自动装配。

    (2)constructor属性

    通过构造方法的参数类型自动装配。

    (3)autodetect属性

    首先会使用constructor方式来自动装配,然后使用byType方式。

    转载:https://blog.csdn.net/dwenxue/article/details/80660959

               https://www.cnblogs.com/MrKeen/p/12028963.html

  • 相关阅读:
    构造函数语义学之Default Constructor构建操作
    c++子类继承父类的覆盖问题
    C++中自己理解的一些细节哈
    学习C++所需看的书和顺序
    C++中强制变换之const_cast
    jquery锚点跳转
    关于iPhone X 适配
    input图片上传并显示查看判断图片类型
    jquery操作按钮修改对应input属性
    织梦dedecms会员中心分类管理无法修改、删除分类名
  • 原文地址:https://www.cnblogs.com/hetaoyuan/p/12508663.html
Copyright © 2011-2022 走看看