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>
- Bean的装配方式
- Bean的装配方式--注解装配
- 基于XML方式的Bean装配实例
- spring的bean装配两种方式
- IOC装配bean(注解的方式)
- Spring之装配bean的方式
- Spring装配Bean的主要方式总结
- Spring装配bean的三种方式
- 装配bean的3种方式
- spring装配bean的三种方式
- Spring 装配Bean的几种方式
- Spring中的Bean的装配方式
- spring基础-Bean的装配方式(三)自动装配
- Spring--IoC--Bean的装配--默认装配方式
- Spring注解方式装配Bean
- Spring的三种装配Bean的方式
- Spring的自动装配Bean的三种方式
- Spring的自动装配Bean的三种方式
- CentOS 7 安装windows字体
- 开发环境
- Android,定时任务AlarmManager
- python逐行读取文件内容的三种方法
- 「2017一月」Top 5 Android libraries (译)
- Bean的装配方式
- iOS--UIGraphicsBeginImageContext系列知识(图片缩放裁剪、改变大小、合并、裁剪部分、保存到媒体库)
- 线程安全和锁优化
- 试一下treeview接收什么样的数据类型
- Java原理 完整java开发中JDBC连接数据库代码和步骤
- 【repo】创建新branch
- 去除表中的重复 记录(多字段)
- bzoj 2822: [AHOI2012]树屋阶梯 (卡特兰数+高精度)
- 这可能是最全的?Redis?集群方案介绍了