要使用IOC注解开发,除了需要引入基本的4个Spring jar包,2个日志jar包,在4.X以上的Spring版本,还需要引入 AOP jar包,因为有一部分的IOC方法被转移到AOP jar中,。如:
spring-aop-5.1.5.RELEASE.jar
同时,创建一个applicationContext.xml配置文件后,还需要引入Context约束
context约束:
xmlns:context=“http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
全部的约束如,applicationContext.xml:
使用注解,还需要在applicationContext.xml文件中配置注解的组件扫描器,以便扫描包下的类所使用的注解。
扫描是为了扫描类上的注解
base-package:指定所需要扫描的包。
如果要扫描多个包,则需要添加多个< context:component-scan>标签,或者使用逗号(,)相隔。
或者可以扫描多个子包的父包,也能达到扫描多个包的目的
扫描是为了扫描类上的注解,如果将xml方式和注解方式整合开发的时候,使用xml方式管理bean,使用注解注入属性。
这时候可以不用在xml中配置扫描器,可以使用 < context:annotation-config/> 标签
在没有扫描器的情况下,使用属性注入的注解:@Resource,@Value,@Autowired,@Qualifier
@Component(value=“dao”) 或者 @Component(“dao”)
等价于< bean id=“dao” classpath=“demo.DaoImpl”/>
指明这个类已经被配置到Spring容器中了:
@Component(value="dao")//等价于< bean id="dao" classpath="demo.DaoImpl"/>
public class DaoImpl implements Dao {
// @Value("kk")
private String name;
@Value("kk")
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save方法被调用了" + name);
}
}
而要在注解的类中添加属性注入,则需要用到
@Value(“abc”) 或者 @Value(daoImpl)(注入对象属性)
注解方法:与xml配置方式不一样,可以不提供SetXXX()方法
属性如果有set方法,需要将属性注入的注解添加在set方法上:
@Value("kk")
public void setName(String name) {
this.name = name;
}
属性如果没有set方法,需要将属性注入的注解添加在属性上:
@Value("kk")
String name;
test测试的代码:
@Test
public void test1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Dao dao = (Dao) applicationContext.getBean("dao");
dao.save();
}
修饰一个类,将这个类交给Spring管理,相当于xml方式的注册一个bean标签,将类托管到Spring容器中
这个注解有三个功能类似的衍生注解,用来修饰类
@Controller:web层
@Service :service层
@Repository:dao层
为了区分代码层次,它们分别用于项目的不同的层,
普通属性 :设置普通属性的值
@Value(“kk”)
String name;
对象类型的值:
如:
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private Dao dao;
@Override
public void save() {
System.out.println("service的save方法被调用了");
dao.save();
}
}
而如果想要和bean方式一样,使用bean名称来指定注入属性的话,还需要搭配另外一个注解使用:
@Autowired
@Qualifier("dao")
private Dao dao;
@Override
public void save() {
System.out.println("service的save方法被调用了");
dao.save();
}
而除此之外,Spring还提供了一个注解,可以单独的按照名称完成属性的注入,强制性的按照名称注入,在日常中常用这种。
@Resource(name="dao")
private Dao dao;
@Override
public void save() {
System.out.println("service的save方法被调用了");
dao.save();
}
测试类test2如下:
@Test
//Spring的IOC的注解方式
public void test2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
}
@PostConstruct
public void init(){
System.out.println("bean的初始化方法初始化了");
}
@PreDestroy
public void destroy(){
System.out.println("bean的销毁方法初始化了");
}
@Scope 注解:作用范围,注解在类上
@Scope(“singleton”) //:默认是单例范围
类型和bean标签中的作用范围是一致的
singleton(单例),prototype(多例模式,用于整合struts2框架),request,session,globalsession
@Component(value="dao")//等价于< bean id="dao" classpath="demo.DaoImpl"/>
@Scope("singleton")
public class DaoImpl implements Dao {
。。。。
}
适用场景
XML:可以适用于任何场景
类结构清晰,维护方便,但是需要配置xml文件比较繁琐
注解:有些地方使用不了,比如当类不是自己提供的时候,无法修改别的类的源码,不能注入属性等
开发方便,书写类的时候添加注解即可;维护麻烦,需要修改源码,而且对于类的结构不能一目了然。
对于XML来说,用来管理Bean十分的方便,可以很清晰的看到类结构,也可以方便进行管理,但是对于类属性的注入,十分的麻烦。
而对于注解来说,管理Bean比较麻烦,需要修改源码,难以看清楚类的整体结构,但是对于属性注入,十分的方便。
而现在可以将两者结合,
XML管理Bean,注解完成属性注入。
那么使用xml管理bean,当没有在类上添加注解的时候,则可以不用配置扫描器,可以使用标签开启注解:,
< context:annotation-config/>
只对类属性上的注解生效。
PS:在配置文件中使用 context 命名空间之前,必须在 元素中声明 context 命名空间。也就是需要引入约束
XML:
在相关类上的配置 ProductService:
package springdemo;
import javax.annotation.Resource;
public class ProductService {
//只使用属性注入的注解,注入对象类型属性
@Resource(name="OrderDao")
private OrderDao orderDao;
@Resource(name="ProductDao")
private ProductDao ProductDao;
public void save() {
System.out.println("ProductService的save方法被调用了");
orderDao.save();
ProductDao.save();
}
}