全网疯传的Spring学习笔记【注解编程】,看完我也想写一个了!
九、注解编程
9.1、注解编程概述
注解编程指的是在类或者方法上加入特定的注解,完成特定功能的开发。使用注解的好处:
- 注解编程开发更方便,代码简洁,开发速度大大提升。
- 注解编程是Spring开发的新趋势。
9.2、注解的作用
-
简化xml文件中繁杂的配置。
-
替换接口,实现调用双方的契约性。通过注解的方式,在功能调用者和功能提供者之间达成约定,进而进行功能的调用。注解形式是主流。
9.3、对象创建相关的注解
这个阶段的注解仅仅只是为了简化XML配置而存在的,并不能完全替代XML。
9.3.1、@Component
9.3.1.1、代码示例
既然我们开始使用注解开发,那么就需要告诉Spring,让Spring框架在你设置的包及其子包中扫描对应的注解,让他生效。
<context:component-scan base-package:"com.lin" />
package cn.lin;
import org.springframework.stereotype.Component;
@Component
@Data
public class User {
private String id;
private String username;
private String password;
}
<?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="cn.lin"/>
</beans>
package cn.lin;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Description
* @Author XiaoLin
* @Date 2021/2/24 21:58
*/
public class UserTest {
/**
* 用于测试注解@Component
*/
@Test
public void testComponent(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = app.getBean("user", User.class);
System.out.println(user);
}
}
9.3.1.2、注意
- 使用
@Component
注解,他创建的对象的id值默认是类名的首字母小写。 - 我们可以通过
@Component("自定义id值")
方式来给创建的对象指定一个id值。 - Spring配置文件是可以覆盖注解配置的内容。id的值和class的值需要保持一致,如果不一致的话Spring会以为这个是一个新的对象,进而不去覆盖。
9.3.1.3、@Component的衍生注解
@Component有三个衍生注解:
- @Repository
- @Service
- @Controller
这些注解本质上就是@Component注解,用法(替代<bean>标签)和细节与@Component没有任何区别,本质上是一模一样的。我们查看源码@Repository可以证明这个结论(其他同理可证)。
Spring提供这些注解是为了更准确的表达一个类型的作用。
- @Repository:主要用于Dao接口。
- @Service:主要用于Service实现类。
- @Controller:主要用于控制器。
9.3.2、@Scope
9.3.2.1、概述
@Scope
注解用于控制简单对象的创建次数。如果我们不添加@Scope
注解的话,他有一个默认值是singleton
。
9.3.2.2、代码示例
// 单例模式,只会创建一次
@Scope("singleton")
public class User(){
}
9.3.3、@Lazy
9.3.3.1、概述
@Lazy
注解的作用是延迟创建单实例对象。
如果没有进行配置的话,默认是在容器创建的时候,同步创建对象。
如果添加了注解的话,在容器创建的时候就不会同步创建对象,而是在你需要使用的时候再创建对象。
9.4、声明周期方法相关的注解
9.4.1、@PostConstruct
@PostConstruct
注解用于方法上,表示这个方法是一个初始化方法。在引入这个注解时,我们需要先加入一组依赖。
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
@Component
@Data
public class User {
// 表示这个是一个初始化方法
@PostConstruct
public void MyInit(){
System.out.printf("User Init");
}
9.4.2、@PreDestroy
@PreDestroy
注解用于方法上,表示这个方法是一个销毁方法。工厂关闭时会自动调用销毁方法。
@PreDestroy
public void MyDestory(){
System.out.printf("User Destory");
}
9.4.3、注意
这连个注解都不是Spring提供的,是JSR(JavaEE规范)520提供的。所以需要导入依赖。
9.5、注入相关的注解
9.5.1、用户自定义类型:@Autowired
9.5.1.1、概述
@Autowired
是一种注解,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作.
@Autowired
标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。
9.5.1.2、代码示例
package cn.lin.dao;
import cn.lin.User;
/**
* @Description
* @Author XiaoLin
* @Date 2021/2/26 9:17
*/
public interface UserMapper {
public void login(User user);
}
package cn.lin.dao;
import cn.lin.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @Description
* @Author XiaoLin
* @Date 2021/2/26 9:18
*/
@Repository
public class UserMapperImpl implements UserMapper{
@Override
public void login(User user) {
System.out.printf("登录了");
}
}
package cn.lin.service;
import cn.lin.User;
/**
* @Description
* @Author XiaoLin
* @Date 2021/2/26 9:19
*/
public interface UserService {
void login(User user);
}
package cn.lin.service.impl;
/**
* @Description
* @Author XiaoLin
* @Date 2021/2/26 9:19
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void login(User user) {
userMapper.login(new User());
}
}
/**
* 用于测试
*/
@Test
public void test(){
ApplicationContext app = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService userService = (UserService)app.getBean("userServiceImpl");
userService.login(new User());
}
9.5.1.3、注意
-
@Autowired
注解默认是基于类型进行注入,注入对象的类型必须与目标成员变量类型相同或者是其子类、实现类。 -
要是想基于名字进行注入的话,需要
@Autowired
结合另一个注解:@Qualifier("需要注入的类的id值")
。基于名字的注入要求注入的对象的ud值必须与@Qualifier
注解中设置的名字相同。 -
@Autowired
注解可以放置的位置:- 可以放置在对应成员变量的set方法上。Spring变量会调用set方法进行注入。
- 直接放置在需要注入的成员变量之上。Spring会通过反射直接对成员变量进行注入。(推荐)
- 点赞
- 收藏
- 关注作者
评论(0)