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方法。
在配置文件中,使用<property>元素来为每个属性注入值;而使用构造注入时,要配置文件里,需要使用元素的子元素来定义构造 方法的参数,可以使用其value属性(或子元素)来设置该参数的值。
案例
创建cn.ssm.assemble包
创建User.java

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

   /**
    * 1.使用构造注入
    * 1.1提供带所有参数 的有参构造 方法
    * @param username
    * @param password
    * @param list
    */
   public User(String username,Integer password,List<String> 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<String> list) {
       this.list = list;
   }

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

创建beans5.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!--1.使用构造注入方式装配User实例-->
 <bean id="user1" class="cn.ssm.assemble.User">
     <constructor-arg index="0" value="tom"/>
     <constructor-arg index="1" value="123456"/>
     <constructor-arg index="2">
         <list>
             <value>"constructorvalue1"</value>
             <value>"constrctorvalue2"</value>
         </list>
     </constructor-arg>
 </bean>
 <!--2.使用设值注入方式装配User实例-->
 <bean id="user2" class="cn.ssm.assemble.User">
     <property name="username" value="张三"></property>
     <property name="password" value="654321"></property>
     <!--注入list集合-->
     <property name="list">
         <list>
             <value>"setlistvalue1"</value>
             <value>"setlistvalue2"</value>
         </list>
     </property>
 </bean>
</beans>

创建测试类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,其写法相当于配置文件中<bean id=“UserDao" class=“cn.ss.annotation.UserDaoImpl”/>

创建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上,这相当于配置文件中<property name="userDao" ref="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

<?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
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd">
   <!--使用context命名空间,在配置文件中开启相应的注解处理器-->
    <context:annotation-config></context:annotation-config>
    <!--对包下的bean进行扫描-->
    <context:component-scan base-package="cn.ssm.annotation"/>
</beans>

通过配置context:annotation-config</context:annotation-config>开启注解处理器
通过<context:component-scan base-package=“cn.ssm.annotation”/>对包路径下的所有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个值,其值及说明下表所示:
在这里插入图片描述
测试案例
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中。

在Spring框架中,Bean的装配是指将各个独立的Bean组合成一个完整的应用程序。Spring提供了几种不同的方式来实现Bean的装配,其中使用setter方法是一种常用的方式。这种方式遵循Java Bean的规范,即通过无参构造函数创建对象后,再通过setter方法来设置对象的属性。 以下是一个简单的使用setter方法装配Bean的示例代码: 1. 首先定义两个简单的Java类,例如一个Car类和一个Engine类。 ```java public class Car { private Engine engine; // Car类的setter方法 public void setEngine(Engine engine) { this.engine = engine; } } public class Engine { private String type; // Engine类的setter方法 public void setType(String type) { this.type = type; } } ``` 2. 创建Spring的配置文件`applicationContext.xml`,在文件中定义这两个类的Bean,并通过`<property>`标签使用setter方法来装配属性。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义Engine的Bean --> <bean id="engine" class="com.example.Engine"> <property name="type" value="1.6L Turbo"></property> </bean> <!-- 定义Car的Bean,并通过setter方法装配Engine --> <bean id="car" class="com.example.Car"> <property name="engine" ref="engine"></property> </bean> </beans> ``` 在这个配置文件中,我们首先定义了一个Engine类的实例,然后在Car类的实例中通过`<property>`标签指定engine属性引用了Engine类的实例。这样在Spring容器启动时,它会自动调用Car类的setEngine方法,并将Engine类的实例注入到Car类的实例中。 这种方式的优点是代码简洁、清晰,且符合POJO(Plain Old Java Objects)的概念,同时有利于进行单元测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聊城云在天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值