什么是注解?
(1)代码里特殊的标记,格式:@注解名称(属性名称=属性值..)
(2)可以在类、方法、属性上添加注解。
使用注解的目的?
可以简化xml配置,使程序变得更简洁、优雅
注解的运用
创建对象提供的注解包含以下4个:
- @Componet
- @Service
- @Controller
- @Repository
特点:上面四个注解的功能都是一样的,都可以用来创建bean实例,建议使用在对应的功能层次中
注解 | 含义 |
---|---|
@Component | 最普通的组件,可以被注入到spring容器进行管理 |
@Repository | 作用于持久层 |
@Service | 作用于业务逻辑层 |
@Controller | 作用于表现层,Controller类 |
属性注入提供的注解:
- @Autowired
- @Qualifier
- @Resource
- @Value
特点:@Autowired、@Qualifier、@Resource可以用于注入对象类型属性,@Value可以用户注入普通类型的属性。
注解 | 含义 |
---|---|
@Autowired | 根据属性类型进行自动装配 |
@Qualifier | 根据属性名称进行注入 |
@Resource | 可以根据属性、名称进行注入 |
@Value | 注入普通类型的属性 |
基于注解实现创建对象
1)引入依赖
<!-- spring-aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
2)开启组件扫描
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描
base-package属性:设置要扫描的包
-->
<context:component-scan base-package="org.leanr.spring5"></context:component-scan>
</beans>
3)类上添加注解
package org.leanr.spring5.service;
import org.springframework.stereotype.Service;
/**
* 类上增加创建对象的注解
* - @Componet
* - @Service
* - @Controller
* - @Repository
* value属性可以不设置,默认是类的名称,首字母小写,
*/
@Service(value = "userService")
public class UserService {
public void add(){
System.out.println("addddddd");
}
}
4)编写测试类
package org.leanr.spring5;
import org.junit.Test;
import org.leanr.spring5.bean.User;
import org.leanr.spring5.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring5 {
/**
* IOC操作Bean管理-注解方式创建对象
*/
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
}
}
测试类执行结果:
org.leanr.spring5.service.UserService@7920ba90
addddddd
组件扫描配置的细节
<!--use-default-filters属性表示:是否开启默认的filter来扫描包下的内容
默认是true,如果设置为false,则需要设置指定的规则
例如下面设置的意思是,注解是@Controller在org.leanr.spring5包下扫描是生效的,其他注解类不会被扫描到
-->
<context:component-scan base-package="org.leanr.spring5" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
基于注解实现属性的注入
第一步注解方式创建对象
第二步在类中注入外部属性,并添加属性的注解
1)@Autowired
@Service(value = "userService")
public class UserService {
//注入属性的注解@Autowired,根据属性类型自动装入
@Autowired
private UserDao userDao;
public void add(){
System.out.println("userService add");
userDao.add();
}
2)@Qualifier
根据属性名称进行注入
/**
* UserDao的实现类
*/
@Repository(value = "userDaoImpl2")
public class UserDaoImpl implements UserDao {
public int add() {
System.out.println("UserDaoImpl add ");
return 1;
}
}
@Service(value = "userService")
public class UserService {
//注入属性的注解@Autowired,根据属性类型自动装入
@Autowired
@Qualifier(value = "userDaoImpl2")
private UserDao userDao;
public void add(){
System.out.println("userService add");
userDao.add();
}
3)@Resource
既可以根据类型也可以名称注入
@Service(value = "userService")
public class UserService {
//注入属性的注解@Autowired,根据属性类型自动装入
//@Autowired
//@Qualifier(value = "userDaoImpl2")
//@Resource //根据类型注入
@Resource(value="userDaoimpl2") //根据名称注解
private UserDao userDao;
public void add(){
System.out.println("userService add");
userDao.add();
}
4)@Value
针对普通类型的属性注入
@Value(value = "zhangsan")
private String userName;
纯注解开发
1)创建配置类,替代xml配置文件
package org.leanr.spring5.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//Configuration,让Spring知道这是个配置类
@Configuration
@ComponentScan(basePackages = {"org.leanr.spring5"})
public class SpringConfig {
}
2)编写测试类
/**
* 完全注解开发
*/
@Test
public void test3(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}