• 8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配


          8.2.6 Spring 4.0 增强的自动装配和精确装配

            Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。当使用@Autowired标注setter方法时,默认采用byType自动装配策略。

            

    package edu.pri.lime._8_2_6.bean;
    
    import java.util.Set;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Chinese {
    
        private Axe axe;
        private Dog dog;
    
        /*
         * 指定setter方法进行自动装配,Spring将会自动搜索容器中类型为Axe的Bean实例,并将该Bean实例作为setter方法的参数传入。
         * 如果找到多个类型为Axe的Bean,Spring会引发异常。如果没有找到Axe类型的Bean,Spring什么都不执行,也不会引发异常
         */
        @Autowired
        public void setAxe(Axe axe) {
            this.axe = axe;
        }
        @Autowired
        public void setDog(Dog dog) {
            this.dog = dog;
        }
        /*
         * 当使用@Autowried修饰带多个参赛的普通方法是,Spring会自动到容器中需找配型匹配的Bean,
         */
        @Autowired
        public void prepare(Axe axe,Dog dog){
            this.axe = axe;
            this.dog = dog;
        }
        /*
         * 当使用@Autowired修饰一个实例变量时,Spring将会把容器中与该实例类型匹配的Bean设置为该实例变量的值。
         * 如果容器中包含多于一个的Axe实例,则Spring容器会抛出BeanCreateException异常。
         */
        @Autowired
        public Chinese(Axe axe , Dog dog){
            this.axe = axe;
            this.dog = dog;
        }
        /*
         * @Autowired 可以用于修饰数组类型的成员变量。
         * Spring 会自动搜索容器中所有Axe实例,并以这些Axe实例作为数组元素来创建数组,最后将该数组赋给数组类型的成员变量。
         */
        @Autowired
        private Axe[] axes;
        
        /*
         * @Autowired 标注集合类型的实例变量,或标注形参类型的集合方法。
         * 对于集合类型的参数而言,必须使用泛型。
         */
        @Autowired
        public void setAxes(Set<Axe> axeSet){
        }
        public Axe getAxe() {
            return axe;
        }
        public Dog getDog() {
            return dog;
        }
        public Axe[] getAxes() {
            return axes;
        }
        public void setAxes(Axe[] axes) {
            this.axes = axes;
        }
        
        
    }

            Spring 4.0 增强后的@Autorwired注解还可以根据泛型进行自动装配。

            Class : BaseDaoImpl<T>

    package edu.pri.lime._8_2_6.bean.impl;
    
    import edu.pri.lime._8_2_6.bean.BaseDao;
    
    public class BaseDaoImpl<T> implements BaseDao<T> {
    
        /*定义所有Dao组件都应该实现的通用方法,其他Dao组件只要继承该类并指定同泛型参数即可*/
        public void save(T e) {
            System.out.println("程序保存对象 " + e);
        }
    
    }

            Class : UserDaoImpl

    package edu.pri.lime._8_2_6.bean.impl;
    
    import org.springframework.stereotype.Component;
    
    import edu.pri.lime._8_2_6.bean.User;
    import edu.pri.lime._8_2_6.bean.UserDao;
    
    @Component("userDao")
    public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
    
        
    }

            Class : ItemDaoImpl

    package edu.pri.lime._8_2_6.bean.impl;
    
    import org.springframework.stereotype.Component;
    
    import edu.pri.lime._8_2_6.bean.Item;
    import edu.pri.lime._8_2_6.bean.ItemDao;
    
    @Component("itemDao")
    public class ItemDaoImpl extends BaseDaoImpl<Item> implements ItemDao {
    
    }

            Class : BaseServiceImpl<T>

    package edu.pri.lime._8_2_6.bean.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import edu.pri.lime._8_2_6.bean.BaseDao;
    import edu.pri.lime._8_2_6.bean.BaseService;
    
    public class BaseServiceImpl<T> implements BaseService<T> {
    
        @Autowired
        private BaseDao<T> dao;
        
        public void addEntity(T entity){
            System.out.println("调用 " + dao + " 保存实体 " + entity);
            dao.save(entity);
        }
    }

            Class : UserServiceImpl

    package edu.pri.lime._8_2_6.bean.impl;
    
    import org.springframework.stereotype.Component;
    
    import edu.pri.lime._8_2_6.bean.User;
    import edu.pri.lime._8_2_6.bean.UserService;
    
    @Component("userService")
    public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {
    
    }

            Class : ItemServiceImpl

    package edu.pri.lime._8_2_6.bean.impl;
    
    import org.springframework.stereotype.Component;
    
    import edu.pri.lime._8_2_6.bean.Item;
    import edu.pri.lime._8_2_6.bean.ItemService;
    
    @Component("itemService")
    public class ItemServiceImpl extends BaseServiceImpl<Item> implements ItemService {
    
    }

            Class : BeanTest

    package edu.pri.lime._8_2_6.bean.main;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import edu.pri.lime._8_2_6.bean.Item;
    import edu.pri.lime._8_2_6.bean.User;
    import edu.pri.lime._8_2_6.bean.impl.ItemServiceImpl;
    import edu.pri.lime._8_2_6.bean.impl.UserServiceImpl;
    
    public class BeanTest {
    
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("app_8_2_6.xml");
            UserServiceImpl us = ctx.getBean("userService",UserServiceImpl.class);
            us.addEntity(new User());
            
            ItemServiceImpl is = ctx.getBean("itemService",ItemServiceImpl.class);
            is.addEntity(new Item());
        }
    }

            @Qualifier允许根据Bean的id来执行自动装配实例变量

        @Autowired
        @Qualifier("steelAxe")
        public void setAxe(Axe axe) {
            this.axe = axe;
        }

            @Qualifier允许根据Bean的id来执行自动装配方法的形参

        @Autowired
        public void setAxe(@Qualifier("steelAxe") Axe axe) {
            this.axe = axe;
        }

    啦啦啦

            啦啦啦

    啦啦啦

    啦啦啦

  • 相关阅读:
    漫谈C语言结构体
    如何理解c和c++的复杂类型声明
    STM32 时钟系统
    STM32 系统架构
    运放参数的详细解释和分析-part1,输入偏置电流和输入失调电流【转】
    ROM、RAM、DRAM、SRAM、FLASH的区别?
    FATFS模块应用笔记
    关于I2C和SPI总线协议【转】
    USB编程概念
    Ubuntu手机识别
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6389533.html
Copyright © 2020-2023  润新知