【Spring入门系列】篇4:SpringIOC注解开发
前言
我们在篇1与篇2讲的都是使用xml来配置的SpringIOC,这篇文章中我们来学习一下SpringIOC的注解开发。
一、配置注解
1.idea开启注解扫描
要想在idea中使用注解,请确保下面这个✅已经打上
2.配置application.xml
在Spring4之后,我们要想使用注解的形式则必须要引入:
spring-aop-5.0.7.RELEASE.jar
接着我们applicationContext.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"
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">
<!--配置那个包下使用注解扫描-->
<context:component-scan base-package="icu.thinmoon.demo1"/>
</beans>
我们的applicationContext.xml多了两行context约束:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
并且我们需要使用以下语句来配置我们需要使用的注解的包,以便Spring进行扫描
<!--配置那个包下使用注解扫描-->
<context:component-scan base-package="icu.thinmoon.demo1"/>
二、注解
1.@Component
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("user")
public class User {
String name;
}
@Component注解作用于类上,它的作用类似于:
<bean id="user" class=".....">
即将User类交由Spring进行管理,并且指定id为user。
@Component还有三个衍生注解分别为:
-
@Controller:使用在web层
-
@Service:使用在service层
-
@Repository:使用在dao层
目前这三个注解功能完全一致,都是将类交由Spring管理。这样做的目的是为了我们写代码时更好的分层。
2.属性注入注解
@Value
@Value的用法很简单,就是给基本类型进行赋值。可以直接在属性定义上方直接注入:
@Component("user")
public class User {
@Value("小明")
String name;
}
也可以在set方法上方进行注入:
@Component("user")
public class User {
String name;
@Value("小明")
public void setName(String name) {
this.name = name;
}
}
@Autowired && @Resource
@Autowired用于给引用对象进行赋值
Dog
@Component("dog")
public class Dog {
@Value("旺财")
String name;
}
User
@Component("user")
public class User {
@Value("小明")
String name;
@Autowired
Dog dog;
}
类似于上方代码,我们直接在dog上方贴一个@Autowired并没有指定id,Spring会在它管理的所有对象中寻找相同类型的对象给我们赋值。
但是我们平常开发过程中更喜欢显示的指定id,这时候我们可以使用@Autowired与@Qualifier共同注入,@Autowired指定了类,@Qualifier指定了id
@Component("user")
public class User {
@Value("小明")
String name;
@Autowired
@Qualifier("dog")
Dog dog;
}
当然,我们可以直接使用@Resource标签进行注入
@Component("user")
public class User {
@Value("小明")
String name;
@Resource(name="dog")
Dog dog;
}
3.生命周期注解
@PostConstruct :标记为初始化方法初始化方法,类似init-method
@PreDestroy:标记为销毁方法,类似destroy-method
@Component("user")
public class User {
@Value("小明")
String name;
@Resource(name="dog")
Dog dog;
@PostConstruct
public void init() {
System.out.println("user--init");
}
@PreDestroy
public void destroy() {
System.out.println("user---destroy");
}
}
4.@Scope
用法于xml中完全一致,标记在类上方即可。
@Component("user")
@Scope("singleton")
public class User {
@Value("小明")
String name;
@Resource(name="dog")
Dog dog;
@PostConstruct
public void init() {
System.out.println("user--init");
}
@PreDestroy
public void destroy() {
System.out.println("user---destroy");
}
}
三、xml形式与注解的区别
- XML可以适用任何场景 ,结构清晰,维护方便
- 注解开发简单方便,但是不是自己提供的类使用不了并且需要到源码中修改
我们可以采用XML与注解整合的方式进行开发,即使用XML管理Bean,利用注解完成属性注入,在这种方式下我们可以不用使用注解扫描,即可以删除以下代码
<!--配置那个包下使用注解扫描-->
<context:component-scan base-package="icu.thinmoon.demo1"/>
单是我们在没有扫描的情况下还想要使用注解进行属性注入需要加上以下代码:
<context:annotation-config/>