一、什么是注解
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解目的:简化 xml 配置
二、Spring 注解创建对象
上面四个注解功能是一样的,都可以用来创建 bean 实例,名称不一样是为了按照约定的习惯规范代码;主要针对自己写的类;
- @Bean:针对外部引入的jar(用在创建方法返回对象上)
- @Lazy:是否为懒加载
- @Scope:指定单实例还是多实例
- @Import:作用在类,可以直接引入类名创建对象实例
- @ImportSelector:可以通过包全类名创建对象实例
- @ImportBeanDefinitionRegistrar:通过在重写方法中手动创建Bean
- @Conditional:根据条件创建对象,条件类需要实现 Condition 接口;可以作用在方法或者类上
- FactoryBean:创建对象实例,定义 bean 类型可以和返回类型不一样;
2.1、注解创建对象
默认的实例名为: 类名首字母小写;也可以自己指定 @Service(value=””)
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
package com.wells.demo.ioc.annotation;
import org.springframework.stereotype.Service;
/**
* Description 通过四种注解方式创建对象实例: @Component、@Service、@Controller、@Respository
* Created by wells on 2020-07-19 20:44:31
*/
@Service
public class UserService {
public void delUser() {
System.out.println("del user");
}
}
配置spring-bean.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="com.wells.demo.ioc.annotation"/>
</beans>
2.2、开启组件扫描细节配置
2.2.1、include-filter
use-default-filters=”false” 表示现在不使用默认 filter,自己配置 filter:【context:include-filter ,设置扫描哪些内容】
<context:component-scan base-package="com.wells.demo" use-default-
filters="false">
<context:include-filter type="annotation"
expression="org.wells.demo.ioc.annotation.service"/>
</context:component-scan>
2.2.2、exclude-filter
下面配置扫描包所有内容 context:exclude-filter: 设置哪些内容不进行扫描
<context:component-scan base-package="com.wells.demo">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
三、Spring 注解注入属性
- 注入自定义类型属性:
- @Autowired:根据属性类型进行注入引用类型
- @Qualifier:根据名称进行注入引用类型,需要与 @Autowired 一起使用
- @Resource:可以根据类型注入引用类型,可以根据名称注入引用类型
- 注入基本类型属性:
- @Value:注入普通类型类型属性
package com.wells.demo.ioc.annotation;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* Description 通过四种注解方式创建对象实例: @Component、@Service、@Controller、@Respository
* 默认的实例名为: 类名首字母小写;也可以自己指定,例如:@Service(value="")
* Created by wells on 2020-07-19 20:44:31
*/
@Service
public class UserService {
// @Autowired // 根据类型进行注入引用类型
// private UserDao userDao;
// @Autowired
// @Qualifier(value = "userDao") // 根据名称进行注入引用类型,但是必须和Autowired一起使用
// private UserDao userDao;
// @Resource // 根据类型注入引用类型
@Resource(name = "userDao") // 根据名称进行注入引用类型
private UserDao userDao;
@Value(value = "wells") // 注入基础类型
private String name;
public void delUser() {
System.out.println("del user in service");
userDao.delUser();
}
@Test
public void testAnnotation() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("component-scan.xml");
UserService userService = applicationContext.getBean("userService", UserService.class);
userService.delUser();
System.out.println(userService.name);
}
}
四、Spring生命周期
XML方式参考:Spring IOC XML
注解方式:
- PostConstruct:初始化方法
- PreDestroy:销毁方法
五、spring配置文件注解
@Configuration // 作为配置类,替代xml配置文件
配置文件替代类,通过 @Configuration 注解代替xml配置文件
package com.wells.demo.ioc.annotation;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* Description
* Created by wells on 2020-07-19 22:40:51
*/
@Configuration
@ComponentScan(basePackages = "com.wells.demo.ioc.annotation")
public class SpringConfig {
}
测试类
@Test
public void testAnnotationByConfiguration(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = applicationContext.getBean("userService", UserService.class);
userService.delUser();
System.out.println(userService.name);
}