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

时间:2023-03-09 17:37:36
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;
}

啦啦啦

        啦啦啦

啦啦啦

啦啦啦