Spring的IOC的注解开发(重点)
Spring的IOC的注解开发的入门
创建一个web项目,引入jar包
- 在src下创建applicationContext.xml
- 引入约束,使用注解开发引入context约束
- 约束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
applicationContext.xml文件
<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 definitions
here -->
</beans>
- 创建接口和实现类
- 首先开启Spring的组件扫描
<!-- Spring的IOC 的注解的入门========================= -->
<!-- 使用IOC的注解开发,配置组件扫面(哪个包下的类要使用IOC注解) -->
<context:component-scan base-package="com.java.spring.demo1"/>
- 在类上添加注解
/*
* 用户DAO的实现类
*/
@Component(value="userDao")//相当于<bean id="userDao" class="com.java.spring.demo1.UserDaoImpl">
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("UserDaoImpl被执行了。。。");
}
}
- 编写测试类
//Spring的IOC注解方式
public void demo2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
UserDao dao = (UserDao)applicationContext.getBean("userDao");
dao.save();
}
注解方式设置属性的值
- 注解方式:使用注解方式,可以没有set方法
- 属性如果有set方法,需要将属性注入的注解添加到set方法
- 属性如果没有set方法,需要将属性注入的注解添加到属性上
@Component(value="userDao")//相当于<bean id="userDao" class="com.java.spring.demo1.UserDaoImpl">
public class UserDaoImpl implements UserDao{
@Value("张三")
private String name;
@Override
public void save() {
System.out.println("UserDaoImpl被执行了。。。"+name);
}
}
这样就可以直接打印这个name,如果是set方法还需要在测试类里面设置这个name的值
Spring的IOC的注解的详解
@Component:组件
- 修饰一个类,将这个类交给Spring管理
- 这个注解有三个衍生注解(功能类似)
- @Controller:web层
- @Service:service层
- Repository:dao层
属性注入的注解
- 普通属性:
- @value:设置普通属性的值
- 对象类型属性
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入
- 我们习惯是按照名称完成属性注入:必须让@Autowired注解和@Qualifier一起使用完成按照名称属性注入
- @Resource:完成对象类型的属性注入,按照名称完成属性注入
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入
Bean的其他的注解
- Bean作用范围的注解
- @Scope:作用范围
- singleton:默认单例
- prototype:多例
- request
- session
- globalsession
- @Scope:作用范围
IOC的XML和注解开发比较
XML和注解比较
- 适用场景:
- XML:可以适用任何场景
- 结构清晰,维护方便
- 注解:有些地方用不了,这个类不是自己提供的
- 开发方便
- XML:可以适用任何场景
XML和注解整合开发
一、XML管理Bean,注解完成属性注入
<!-- Spring的IOC 的注解的入门========================= -->
<!-- 使用IOC的注解开发,配置组件扫面(哪个包下的类要使用IOC注解) -->
<context:component-scan base-package="com.java.spring"/>
<bean id="productService" class="com.java.spring.demo2.ProductService">
<property name="productDao" ref="productDao" />
<property name="orderDao" ref="orderDao" />
</bean>
<bean id="productDao" class="com.java.spring.demo2.ProductDao"></bean>
<bean id="orderDao" class="com.java.spring.demo2.OrderDao"></bean>
新建三个类,分别为ProductDao、OrderDao、ProductService
package com.java.spring.demo2;
public class ProductDao {
public void save() {
System.out.println("ProductDao的save被执行了。。。");
}
}
package com.java.spring.demo2;
public class OrderDao {
public void save() {
System.out.println("OrderDao被执行了。。。");
}
}
package com.java.spring.demo2;
import javax.annotation.Resource;
public class ProductService {
private ProductDao productDao;
private OrderDao orderDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
public void save() {
System.out.println("ProductService的save方法被调用了。。。");
productDao.save();
orderDao.save();
}
}
测试类
package com.java.spring.demo2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ProductService service = (ProductService)applicationContext.getBean("productService");
service.save();
}
public static void main(String[] args) {
Test test = new Test();
test.demo1();
}
}
二、XML与注解整合
applicationContext.xml文件
<!-- 在没有扫描的情况下使用属性注入注解 -->
<context:annotation-config/>
<bean id="productService" class="com.java.spring.demo2.ProductService">
<!-- <property name="productDao" ref="productDao" />
<property name="orderDao" ref="orderDao" /> -->
</bean>
<bean id="productDao" class="com.java.spring.demo2.ProductDao"></bean>
<bean id="orderDao" class="com.java.spring.demo2.OrderDao"></bean>
主要修改productDao类就行(要用到注解就不需要set方法了)
package com.java.spring.demo2;
import javax.annotation.Resource;
public class ProductService {
@Resource(name="productDao")
private ProductDao productDao;
@Resource(name="orderDao")
private OrderDao orderDao;
/*public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}*/
/*public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}*/
public void save() {
System.out.println("ProductService的save方法被调用了。。。");
productDao.save();
orderDao.save();
}
}