属性value
用于指定bean的id
一般用在表现层
一般用在业务层
一般用在持久层
后三个注解与Component
相同,用在不同的层,使三层的结构更加清晰。
修改service.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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<!-- 扫描包中的注解 -->
<context:component-scan base-package="demo"></context:component-scan>
</beans>
类似于xml中写入
标签,注入依赖,通过@Autowired
注解自动进行配置,常加在方法前和类前。
注入过程:
@Service("accountService")
public class AccountServiceImpl implements IAccountService {
@Autowired
private AccountImpl account;
@Override
public void show() {
account.selectById();
System.out.println("表现层执行show操作");
}
}
//获取 核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("service.xml");
//根据id获取bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
as.show();
key
值查询,查询value
类型,如果匹配则直接创建。key
位置的相同类型,所以会有推荐命名,保证方便查找如果上述过程都不同,则使用@Qualifier
注解,在按照类
中注入的基础上按照名称
注入。注意⚠️:在给类成员使用时不能单独使用,再给方法参数注入时可以单独使用。
使用在参数名前,如果有多个datasource类型资源,通过name指定使用其中一个。
直接使用id,对对象进行注入。
${表达式}
用于修改对象的范围,单例或者多列,默认单例,prototype
多例
使用config配置文件进行配置时,使用的容器类改为AnnotationConfigApplicationContext(class)
传入配置文件的类。
用来表明这是一个配置文件。
AnnotationConfigApplicationContext(class)
的对象创建参数时,该注解可以不写。用来对包进行扫描,其中basePackages 和 value参数相同,都是输入被扫描的包。
将当前方法作为返回值,作为bean对象存入IOC容器中。
属性:
提供Mapper包名,扫描所有mapper文件
属性:
在当前config
文件上添加其他config
文件进行配置,有@Import
注解的类就是父配置类,没有的就是子配置类。
用于指定properties文件的位置
classpath
JUnit原理:
@Test
注解,并且执行在使用@Test
类进行功能测试前,使用@Before
对需要使用的Spring容器对象进行创建。
AnnotationConfigApplicationContext ac;
IEmployeeService employeeService;
@Before
public void init(){
//获取容器对象
ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
employeeService = ac.getBean("employeeService",IEmployeeService.class);
IEmployeeService employeeService2 = ac.getBean("employeeService",IEmployeeService.class);
System.out.println(employeeService2==employeeService);
}
但是如果不写这些内容,或者通过@Autowired
注解对容器对象进行获取是获取不到的。这是因为:JUnit单元测试这是单纯的单元测试,不会对其中的Spring注解进行运行,也就是说自动获取无效。例如:
@Autowired
private IAccountService as = null;
解决方式:
<!-- 加入spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
测试方法上加@RunWith
注解,替换成Spring提供的main方法
属性:class
注意⚠️:test方法需要放在src/test
测试包下才能运行。
@ContextConfiguration
注解:classpath
关键字,表示在类路径下@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class TestService {
@Autowired
private IEmployeeService employeeService = null;
通过xml获取:
@contextConfiguration(locations = "classpath:service.xml")
通过这种方式直接获取IEmployeeService
对象而不需要通过AnnotationConfigApplicationContext
对象来获取