Bean的装配方式

来源:互联网 发布:gtv网络棋牌直播 编辑:程序博客网 时间:2024/06/05 03:30

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean的依赖注入方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于Annotation的装配和自动装配。

1.基于XML的装配

Spring依赖注入有两种setter注入和构造注入

设值注入要求一个Bean必须满足两点:Bean类必须提供一个默认的构造方法。Bean类必须为需要注入的属性提供对应的setter方法。

User.java

package cn.assemble;
public class User {
private String username;
private Integer password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
/**
* 默认构造
*/
public User() {
super();
}
/**
* 构造方法注入
*/
public User(String username, Integer password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}

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">
  <!-- 使用构造方式装配user实例 -->
  <bean id="user1" class="cn.assemble.User">
  <constructor-arg index="0" value="jack"/>
  <constructor-arg index="1" value="1234"/><constructor-arg>元素用来定义构造方法的参数,

  </bean>
  <!-- 使用set方式装配user实例 -->
  <bean id="user2" class="cn.assemble.User">
  <property name="username" value="tom"></property>
  <property name="password" value="4321"></property>

  </bean>
</beans>

XmlBeanAssembleTest.java

package cn.itcast.assemble;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class XmlBeanAssembleTest {
@Test
public void xmlAssembleTest(){
String xmlPath = "cn/assemble/beans5.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//构造方式输出结果
System.out.println(applicationContext.getBean("user1"));
//设置方式输出结果
System.out.println(applicationContext.getBean("user2"));
}
}

控制台输出的结果:

User[username=jack,password=1234]

User[username=tom,password=1234]

2.基于Annotation的装配

在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean时,会导致XML配置文件过于臃肿,给后续的维护和升级工作带来一定的困难,为此,java从JDK1.5以后,提供Annotation(注解)功能,Spring也提供了对Annotation技术的全面支持。Spring中定义了一系列注解,常用的注解如下所示:

@Component:可以适用此注解描述Spring中的Bean,但它是一个泛化的概念,仅表示一个组件(Bean),并且可以作用在任何层次,使用时只需将该注解标注在相应的类上即可。

@Repository:用于将数据库访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同。

@Service:通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。

@Controller:通常作用在控制层,用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。

@Autowired:用于对Bean的属性变量、属性的Set方法及构造函数进行标注,配合对应的注解处理器完成Bean的自动装配工作。默认按照Bean的类型进行装配。

@Resource:其作用与Autowired一样。其区别在于@Autowired默认按照Bean的类型进行装配,而@Resource默认按照Bean实例名称进行装配。@Resource中有两个重要的属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按照实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则按照Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException。

@Qualifier:与@Autowired注解配合适用,会将默认的按Bean类型装配修改为按Bean实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

在适用中 尽量使用@Repository@Service@Controller对类进行标注。

UserDao.java

package cn.annotation;
public interface UserDao {
public void save();
}

UserDaoImpl.java

package cn.annotation;
import org.springframework.stereotype.Repository;
@Repository("userDao") //写法相当于<bean id="userDao"  class="cn.annotation.UserDaoImpl">
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("userdao...save...");
}
}

UserService.java

package cn.annotation;
public interface UserService {
public void save();
}

UserServiceImpl.java

package cn.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userDao")//相当于配置文件<property name="userDao" ref="userDao"/>
private UserDao userDao;
/**
* userDao的set方法
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
//调用userDao中的save方法
this.userDao.save();
System.out.println("userservice...save...");
}
}

UserAction.java

package cn.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
@Controller("userAction")
public class UserAction {
@Resource(name="userService")
private UserService userService;
/**
* userService的set方法
*/
public void setUserService(UserService userService) {
this.userService = userService;
}
void save() {
//调用userService中的save方法
this.userService.save();
System.out.println("userAction...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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
                                                       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                                                       http://www.springframework.org/schema/context 
                                                       http://www.springframework.org/schema/context/spring-context-2.5.xsd
                                                       http://www.springframework.org/schema/tx 
                                                       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!--使用context命名空间,通知spring扫描指定目录,进行注解的解析-->
<context:component-scan base-package="cn.annotation" />

</beans>

TestApp.java

package cn.annotation;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApp {
@Test
public void demo01() {
String xmlPath = "cn/annotation/beans6.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
UserAction userAction = (UserAction) applicationContext.getBean("userAction");
System.out.println(userAction);
userAction.save();
}
}

控制台输出:

cn.annotation.UserAction@bffa22

userdao...save...

userservice...save...

userAction...save...

3.自动装配

除了使用XML和Annotation进行装配Bean,还有一种常用的装配方式就是使用自动装配。所谓自动装配,就是将一个Bean注入到其他Bean的Property中。

要使用自动装配,就需要配置<bean>元素的autowire属性。autowire属性有5个值

byName:根据Property的Name自动装配,如果一个Bean的name和另一个Bean中的Property的name相同,则自动装配这个Bean到Property中。

byType:根据Property的数据类型(TYPE)自动装配,如果一个Bean的数据类型和另一个Bean中的Property的数据类型相同,则自动装配这个Bean到Property中。

constructor:根据构造函数参数的数据类型,进行byType模式的自动装配

autodetect:如果发现默认的构造函数,用constructor模式,否则用byType模式

no:默认情况下,不适用自动装配,Bean依赖必须通过ref元素定义。

<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
                                                       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                                                       http://www.springframework.org/schema/context 
                                                       http://www.springframework.org/schema/context/spring-context-2.5.xsd
                                                       http://www.springframework.org/schema/tx 
                                                       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="userDao" class="cn.annotation.UserDaoImpl"/>
<bean id="userService" class="cn.annotation.UserServiceImpl" autowire="byName"/>
<bean id="userAction" class="cn.annotation.UserAction" autowire="byName"/>

</beans>

0 0
原创粉丝点击