4.Bean的装配方式

1.Bean的装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),本节将主要讲解这三种装配方式的使用.

1.1 基于XML的装配

基于XML的装配有两种:设值注入(Setter Injection)和构造注入(Constructor Injection)
在Spring实例化Bean的过程中,Spring首先会使用Bean的默认构造方法来实例 化Bean对象,然后通过反射的方式调用setter方法来注入属性值。因此,设值注入要求一个Bean必须满足以下两点要求。
Bean类必须提供一个默认的无参构造方法。
Bean类必须为需要注入的属性提供对应的setter方法。
在配置文件中,使用元素来为每个属性注入值;而使用构造注入时,要配置文件里,需要使用元素的子元素来定义构造 方法的参数,可以使用其value属性(或子元素)来设置该参数的值。
案例
创建cn.ssm.assemble包
创建User.java

public class User {
   private String username;
   private Integer password;
   private List list;

   /**
    * 1.使用构造注入
    * 1.1提供带所有参数 的有参构造 方法
    * @param username
    * @param password
    * @param list
    */
   public User(String username,Integer password,List list){
       super();
       this.username=username;
       this.password=password;
       this.list=list;
   }
   /**
    * 2.使用设值注入
    * 2.1 提供默认空参构造方法;
    * 2.2为所有属性提供setter方法
    *
    *  */
   public User(){
       super();
   }

   public void setUsername(String username) {
       this.username = username;
   }

   public void setPassword(Integer password) {
       this.password = password;
   }

   public void setList(List list) {
       this.list = list;
   }

   @Override
   public String toString() {
       return "User{" +
               "username='" + username + '\'' +
               ", password=" + password +
               ", list=" + list +
               '}';
   }
}

创建beans5.xml



 
 
     
     
     
         
             "constructorvalue1"
             "constrctorvalue2"
         
     
 
 
 
     
     
     
     
         
             "setlistvalue1"
             "setlistvalue2"
         
     
 

创建测试类XmlBeanAssembleTest

public class XmlBeanAssembleTest {
   public static void  main(String[] args){
       String xmlpath="cn/ssm/assemble/beans5.xml";
       ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);
       //构造方式输出结果
       System.out.println(applicationContext.getBean("user1"));
       //设值方式输出结果
       System.out.println(applicationContext.getBean("user2"));
   }
}

运行测试

1.2 基于Annotation的装配

基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。

@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。
@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。其作用与@Component相同
@Service:用于将业务层(Service)的类标识为Spring中的Bean。
@Controller:用于将控制层(Controller)的类标识为Spring中的Bean
@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作
@Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型
@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

案例
创建cn.ssm.annotation包,在该包中创建接口UserDao,并在接口中定义一个save方法。

UserDao接口

public interface UserDao {
    public void save();
}

UserDao的实现类 UserDaoImpl

//使用@Repository注解将UserDaoImpl类标识为Spring中的Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("userdao...save....");
    }
}

使用@Repository注解将UserDaoImpl类标识为Spring中的Bean,其写法相当于配置文件中

创建UserService接口

public interface UserService {
    public void save();
}

创建UserService实现类

@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource(name="userDao")
    private UserDao userDao;
    @Override
    public void save() {
        //调用 userDao中的save方法
        this.userDao.save();
        System.out.println("userservice...save....");
    }
}

使用@Service注解将UserServiceImpl类标识为Spring中的Bean
使用@Resource注解标注在属性userDao上,这相当于配置文件中

创建控制器类UserController

@Controller("userController")
public class UserController {
    @Resource(name="userService")
    private UserService userService;
    public void save(){
        this.userService.save();
        System.out.println("userController...save...");
    }
}

创建beans6.xml



   
    
    
    

通过配置context:annotation-config开启注解处理器
通过对包路径下的所有Bean文件进行扫描。

创建测试类 AnnotationAssembleTest.java

public class AnnotationAssembleTest {
    public static void main(String[] args){
        String xmlpath="cn/ssm/annotation/beans6.xml";
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);
        //获取UserController实例
        UserController userController=(UserController) 
        applicationContext.getBean("userController");
        userController.save();
    }
}

输出结果:
userdao…save…
userservice…save…
userController…save…

1.3 自动装配

所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:
4.Bean的装配方式_第1张图片
测试案例
1.修改UserServiceImpl和UserController,分别在文件中增加类属性的setter方法
2.修改配置文件beans6.xml,在该配置文件中取消了注解的配置。userService和userController中的<bean>元素中除了id和class属性外,还增加了autowire属性,并将其属性值设置为byName。
在默认情况下,配置文件中需要通过ref来装配Bean,但设置了autowire=“byName"后,Spring会自动寻找userService Bean中的属性,并将其属性名称与配置文件中定义的Bean做匹配。由于UserServiceImpl中定义了userDao属性及其setter方法,这与配置文件中id为userDao的Bean相匹配,所以Spring会自动地将id为userDao的Bean装配到id为userService的Bean中。

你可能感兴趣的:(java框架技术)