使用注解开发Spring
【注意】:在spring4之后,想要使用注解形式,必须得要引入aop的包
还需要在配置文件中引入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:comtext="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
https://www.springframework.org/schema/context/spring-context.xsd">
<comtext:annotation-config/>
</beans>
9.1、Bean的实现
我们之前都是使用 bean 的标签进行bean注入,但是实际开发中,我们一般都会使用注解!
- 给类添加
@Component
注解后,这个类就交给了Spring管理,相当于一个Bean
。
等价于配置文件的:
<bean id="user" class="com.jh.domain.User"/>
-
不添加参数时,Bean的id为这个类的类名首字母小写。
-
添加value属性后,id为value的值。
具体实现步骤:
-
在applicationContext.xml中配注解扫描
<!-- 指定要扫描的包,这个包下的所有注解都会生效 --> <context:component-scan base-package="com.jh.domain"/>
-
编写实体类,添加
@Component
注解@Component(value = "user") public class User { private String name; @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
测试结果,输出user,说明注解使用成功!
@Test public void test01() throws Exception{ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = context.getBean("user", User.class); System.out.println(user); }
9.2、属性的注入
我们也可以使用@Value注解为Bean注入属性
使用@Value
注解,它的参数就是您需要注入的值。
它等价于xml的:
<property name="name" value="姓名"/>
具体实现:
-
为实体类的属性添加
@Value
注解@Component public class User { @Value("姓名") private String name; // 使用@Value注解的属性,不需要添加set方法 }
-
如果属性有
set
方法,也可以将@Value
注解添加在其上面@Component public class User { private String name; @Value("姓名") public void setName(String name) { this.name = name; } }
9.3、衍生的注解
@Component有几个衍生注解,我们在web开发中,会按照MVC三层架构分层!
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
-
@Controller:【web层】
import org.springframework.stereotype.Controller; @Controller public class UserController { }
-
@Service:【service层】
import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { }
-
@Repository:【dao层】
import org.springframework.stereotype.Service; @Repository public class UserDaoImpl implements UserDao { }
@Component和这个三个衍生注解的功能都是一样的,都代表将其交给Spring管理,是一个Bean
【注意】要使用这个几个注解,必须现在spring配置文件了设置注解扫描
我们可以设置扫描器扫描它们的上一级包,这样就可以实现扫描所有注解
<context:component-scan base-package="com.jh"/>
使用com.jh
包就可以扫描其下面所有的子包
9.4、自动装配的注解
在自动装配时已经提到过了,自动装配的注解
- @Autowired:使用byType方式注入
- @Autowired配合@Qualifier可以实现先byType,再byName
- @Resource注解:先byName,再byType
详情请见:https://www.cnblogs.com/paidaxing0623/p/14312223.html
9.5、作用域
我们可以用过@Scope注解指定Bean的作用域
使用@Scope
注解可以设定以下值
- @Scope,相当于@Scope("singleton")【单例模式;默认】
- @Scope("prototype")【原型模式】
- @Scope("request")
- @Scope("session")
- 等等……
一般开发中常用的是singleton和prototype两种
它相当于xml中的
具体实现:
@Component
@Scope
public class User {
private String name;
@Value("姓名")
public void setName(String name) {
this.name = name;
}
}
9.6、小结
XML与注解的比较
- XML方式适用于任何场景,结构清晰,维护方便!
- 注解只能特定的类使用,维护相对复杂,但是开发简单方便!
XML与注解整合开发:推荐最佳实践
- XML用来管理Bean
- 注解只负责完成属性的注入
- 使用过程中,注意要使用注解,必须开启注解的扫描
<!-- 自动装配时使用 -->
<context:annotation-config/>
<!-- 指定要扫描的包,这个包下的所有注解都会生效 -->
<context:component-scan base-package="com.jh"/>
作用:
- 进行注解驱动注册,从而使注解生效
- 用于激活那些已经在spring容器里注册过的bean上面的注解,也就是显示的向Spring注册
- 如果不扫描包,就需要手动配置bean
- 如果不加注解驱动,则注入的值为null!