1.使用注解方式进行Bean注册
xml 方式: <bean id="" class="">
spring2.5版本 提供一组注解,完成Bean注册
* @Component 描述Spring框架中Bean
导入jar 和 xml方式开发是相同的
第一步 编写Class,在声明上 添加 @Component
/**
* 使用Spring2.5注解 注册Bean
*/
@Component("helloService")
// <bean id="helloService" class="...." />
public class HelloService {
public void sayHello() {
System.out.println("hello, spring annotation!");
}
}
第二步 编写applicationContext.xml 通知Spring注解类所在包
* 需要引入 context 名称空间
<?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">
<!-- 配置 注解Bean 所在包 -->
<context:annotation-config/>
<context:component-scan base-package="cn.itcast.spring.a_beandefinition"></context:component-scan>
</beans>
public class SpringTest {
@Test
// 测试 注解Bean 注册
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");- //bean的名称来自@Component("helloService")
HelloService helloService = (HelloService) applicationContext
.getBean("helloService");helloService.sayHello();
}
}
* @Repository 用于对DAO实现类进行标注 (持久层)
* @Service 用于对Service实现类进行标注 (业务层)
* @Controller 用于对Controller实现类进行标注 (表现层)
2.属性依赖注入
1) 简单属性的注入 通过 @Value注解完成,不需要提供setter方法
@Service("userService")
public class UserService {
// 注入name属性
@Value("itcast")
private String name;
}
2) 复杂属性注入,通过@Autowired注解 完成Bean自动装配
@Autowired 默认按照类型进行注入
/**
* 用户操作数据层
*/
@Repository("userDAO")
public class UserDAO {
}
/**
* 用户业务层
*/
@Service("userService")
public class UserService {
// 注入name属性
@Value("itcast")
// 简单属性
private String name;
- //@Autowired默认按照类型
@Autowired
private UserDAO userDAO;
@Override
public String toString() {
return "UserService [name=" + name + ", userDAO=" + userDAO + "]";
}
}
@Autowired注解 结合 @Qualifer注解按照名称注入
@Service("userService")
public class UserService {
@Autowired
@Qualifier("uDAO")
// 复杂对象
private UserDAO userDAO;
}
@Repository("uDAO")
public class UserDAO {
}
3) 使用@Resource注解 完成复杂对象Bean装配
@Resource和@Autowired注解功能相似
@Autowired
@Qualifer("userDAO")
private UserDAO userDAO ;
@Resource(name="userDAO")
private UserDAO userDAO ;
3.Bean其它属性设置
1) 指定Bean的初始化方法和销毁方法(注解) <bean init-method="" destroy-method="" />
@PostConstruct 作用 init-method
@PreDestroy 作用 destroy-method
@Component("lifeBean")
public class LifeCycleBean {
@PostConstruct
public void setup() {
System.out.println("初始化...");
}
@PreDestroy
public void teardown() {
System.out.println("销毁...");
}
}
@Test
// 测试初始化和销毁
public void demo1() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");LifeCycleBean lifeCycleBean = (LifeCycleBean) applicationContext
.getBean("lifeBean");System.out.println(lifeCycleBean);
// 销毁方法执行,必须销毁ApplicationContext
applicationContext.close();
}
2) Bean的作用范围 <bean scope="" />
@Scope 注解 ,默认作用域 singleton 单例
@Component("scopeBean")
// 如果没有指定scope 是 singleton 单例
@Scope("prototype")
public class ScopeBean {
}
@Test
// 测试Bean 范围
public void demo2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");ScopeBean scopeBean = (ScopeBean) applicationContext
.getBean("scopeBean");System.out.println(scopeBean);
ScopeBean scopeBean2 = (ScopeBean) applicationContext
.getBean("scopeBean");System.out.println(scopeBean2);
}
4.Spring3.0 提供 注册Bean的注解
@Configuration 指定POJO类为Spring提供Bean定义信息
@Bean 提供一个Bean定义信息
先定义2个JavaBean:
// 轿车
public class Car {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
// 商品
public class Product {
private String pname;
private int pnum;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPnum() {
return pnum;
}
public void setPnum(int pnum) {
this.pnum = pnum;
}
@Override
public String toString() {
return "Product [pname=" + pname + ", pnum=" + pnum + "]";
}
}
/**
* 配置Bean (工厂)
*/
@Configuration
public class BeanConfig {
// 提供两个方法 获得Car和Product对象
@Bean(name = "car")
//方法名称随意
public Car initCar() {
Car car = new Car();
car.setName("大众");
car.setPrice(10000);
return car;
}
@Bean(name = "product")
public Product showProduct() {
Product product = new Product();
product.setPname("空调");
product.setPnum(100);
return product;
}
}
@Test
// 获得配置Bean 工厂创建Bean对象
public void demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");Car car = (Car) applicationContext.getBean("car");
System.out.println(car);
Product product = (Product) applicationContext.getBean("product");
System.out.println(product);
}
5.xml和注解混合使用
很多企业开发者 还是采用xml作为主流配置
* Bean 注册 通过XML完成
* 注入使用 @Autowired 注解完成
将2个Dao注入到Service
// 客户DAO
public class CustomerDAO {
}
// 订单DAO
public class OrderDAO {
}
// 客户Service
public class CustomerService {
// xml注入
private CustomerDAO customerDAO;
public void setCustomerDAO(CustomerDAO customerDAO) {
this.customerDAO = customerDAO;
}
@Override
public String toString() {
return "CustomerService [orderDAO=" + orderDAO + ", customerDAO="
+ customerDAO + "]";
}
}
<bean id="customerDAO" class="cn.itcast.spring.e_xmluseannotaion.CustomerDAO"></bean>
<bean id="orderDAO" class="cn.itcast.spring.e_xmluseannotaion.OrderDAO"></bean>
<!-- 将DAO 注入Service -->
<bean id="customerService" class="cn.itcast.spring.e_xmluseannotaion.CustomerService">
<property name="customerDAO" ref="customerDAO"></property>
</bean>
@Test
// 完成 DAO 注入到Service测试
public void demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext2.xml");CustomerService customerService = (CustomerService) applicationContext
.getBean("customerService");System.out.println(customerService);
}
// 客户Service
public class CustomerService {
// 注解注入
@Autowired
private OrderDAO orderDAO;
// xml注入
private CustomerDAO customerDAO;
public void setCustomerDAO(CustomerDAO customerDAO) {
this.customerDAO = customerDAO;
}
@Override
public String toString() {
return "CustomerService [orderDAO=" + orderDAO + ", customerDAO="
+ customerDAO + "]";
}
}
<context:annotation-config/> 启用四个注解 使@Resource、@ PostConstruct、@ PreDestroy、@Autowired注解生效
结论 :
1、 xml配置 和 注解配置 效果完全相同
2、 如果Bean 来自第三方(源码无法改动), 必须使用xml
3、 Spring3.0 Bean注册方式, 使用比较少,主要用于Bean 构造逻辑及其复杂