文章目录
前言
大家应该都知道Spring的一大核心思想就是IOC控制反转,可以通过applicationContext.xml的方式管理很多bean,但是一旦管理的bean多了,配置文件就会显得很冗余,所以spring又提供了更好的方式解决这个问题——注解。
一、配置类
1.1 @Configuration
含义:配置类
注意测试时需要配合AnnotationConfigApplicationContext加载“主”配置类
// 表明此类是配置类
@Configuration
public class ApplicationConfig {
}
1.2 @ComponentScan
作用:等同于配置文件中的<context:component-scan base-package=“”></context:component-scan>,扫描base-package路径下的所有注入类
用法:@ComponentScan(basePackages = {“com.apesource”})
@Configuration
@ComponentScan(basePackages = {"com.apesource"})
public class ApplicationConfig {
}
1.3 @PropertySource
作用:等同于配置文件中的<context:property-placeholder location=“”></context:property-placeholder>,加载路径中的properties文件获取键值对的key
用法:@PropertySource(value = “classpath:msg.properties”)
//此时是一个新配置类
@Configuration
@PropertySource(value = "classpath:msg.properties")
public class DataApplicationConfig {
}
1.4 @Import
作用:导入其他配置类,可以将配置类分的更散,最终通过@Import加载到一个“主”配置类中,更加灵活
用法:@Import(DataApplicationConfig.class)
@Configuration
@ComponentScan(basePackages = {"com.apesource"})
@Import(DataApplicationConfig.class)
public class ApplicationConfig {
}
1.5 @Bean
作用:注入类,它常用在注入java已有的类(方法返回值为class 方法名称为id);例如:Date
位置:方法上方
注意:单独使用,无需扫描
@Configuration
@ComponentScan(basePackages = {"com.apesource"})
@Import(DataApplicationConfig.class)
public class ApplicationConfig {
@Bean
public Date getDate(){
return new Date();
}
}
//测试类
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Date date = (Date) applicationContext.getBean("getDate");
System.out.println(date);
}
}
测试结果:
二、注入类
2.1 @Component
含义:将注解所修饰的类注入spring容器
位置:类上方
语法:@Component(value = “id”)
- 如果省略value=“id"默认注入的id为类的名称且首字母小写
注意:不可以单独使用
需要配合<context:component-scan base-package=”"></context:component-scan>或@ComponentScan
@Component
public class Love {
}
//测试
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Love love = (Love) applicationContext.getBean("love");
System.out.println(love);
}
}
测试结果:
2.2 @Repository 、@Service、@Controller
- @Repository注入数据访问层
- @Service注入业务层
- @Controller 注入控制层
以上以上三个注解与**@Component**功能语法一致,目的是为了更好区分不同层级;
下面是不同层级的接口以及实现类
public interface IUserDao {
public void save();
}
@Repository
public class UserDaoImp implements IUserDao{
@Override
public void save() {
System.out.println("===dao数据访问层===");
}
}
public interface IUserService {
public void save();
}
@Service
public class IUserServiceImp implements IUserService{
IUserDao iUserDao;
@Override
public void save() {
System.out.println("===service业务逻辑层===");
iUserDao.save();
}
}
public interface IUserController {
public void save();
}
@Controller
public class UserControllerImp implements IUserController {
IUserSerivce serivce;
@Override
public void save() {
System.out.println("===controller控制访问层===");
serivce.save();
}
}
2.3 @Value、@Autowired
- @Value
- 含义:向属性注入基本类型与String
语法:@Value(“数据”)或@Value(“${key}”)
位置:属性
注意:不能单独使用
<context:property-placeholder location=“”></context:property-placeholder>或@PropertySource- @Autowired
- 替换:自动装配属性
位置:属性
含义:通过“set”方法【set方法可以省略】,按照“类型”自动装配,如果类型冲突则按照"名称"装配
注意: 1.按类型装配如果冲突切换为名称装配 2.按类型装配如果冲突切换为名称装配,如果名称也没有则会抛异常NoUniqueBeanDefinitionException 3.3.按类型装配没一个匹配NoSuchBeanDefinitionException
public interface IUserDao {
public void save();
}
@Repository
public class UserDaoImp implements IUserDao{
@Override
public void save() {
System.out.println("===dao数据访问层===");
}
}
public interface IUserService {
public void save();
}
@Service
public class IUserServiceImp implements IUserService{
@Autowired
IUserDao iUserDaoImp;
@Override
public void save() {
System.out.println("===service业务逻辑层===");
iUserDaoImp.save();
}
}
public interface IUserController {
public void save();
}
@Controller(value="controller")
public class UserControllerImp implements IUserController {
@Autowired
IUserSerivce serivce;
@Override
public void save() {
System.out.println("===controller控制访问层===");
serivce.save();
}
}
@Component
public class Love {
@Value("${msg1}")
private String love1;
@Value("${msg2}")
private String love2;
@Override
public String toString() {
return "Love{" +
"love1='" + love1 + '\'' +
", love2='" + love2 + '\'' +
'}';
}
}
//测试
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Love love = (Love) applicationContext.getBean("love");
System.out.println(love);
IUserController iUserController = (IUserController) applicationContext.getBean("controller");
iUserController.save();
}
}
测试结果:
三、其他常用注解
3.1 @Primary
含义:在类型装配冲突的情况下,此注解所修饰的类作为首选项
位置:类上方
注意:不可以单独使用,需要配合注入类使用
3.2 @Qualifier和@Resource
- @Qualifier
- 含义:按照名称装配
语法:@Qualifier(value = “名称”)
位置:属性
注意:不能单独使用,需配合**@Autowired**使用- @Resource
- 含义:按照名称装配
语法:@Resource(name = “名称”)
位置:属性
作用:等同于**@Autowired和@Qualifier**一起使用的效果
3.3 @Scope
含义:作用域
位置:类
注意:不能单独用
默认:单例
举例:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 或@Scope(“prototype”)
3.4 @PostConstruct
含义:替换bean标签中的init-method
位置:方法
注意:单独用
3.5 @PreDestroy
含义:替换bean标签中的destory-method
位置:方法
注意:单独用
总结
以上就是spring框架常用的基础注解了,通过这些注解,可以很好的解决代码臃肿的问题,并且很好的使对象之间产生了松散耦合的关系,使得更加灵活,简洁。(缺点是可读性降低)