作者:狮子也疯狂
专栏:《spring开发》
坚持做好每一步,幸运之神自然会驾凌在你的身上
专栏推荐:写文章刚刚起步,各个专栏的知识点后续会补充完善,不断更新好文,希望大
家支持一下。
专栏 | 名字 |
---|---|
Elasticsearch专栏 | es |
spring专栏 | spring开发 |
redis专栏 | redis学习笔记 |
项目专栏 | 项目集锦 |
修bug专栏 | bug修理厂 |
一.🦁 前言
前面讲解了IOC的基本概念以及操作演示,但是spring配置文件较多,操作起来相对麻烦。今天我们使用注解来操作实现IOC的功能。
二.🦁 注解实现配置
注解配置和xml配置对于Spring的IOC要实现的功能都是一样的,只是配置的形式不一样
。
Ⅰ.🐇 准备工作
- 创建一个新的Spring项目。
- 编写pojo,dao,service类。
- 编写空的配置文件
需要用到的连接数据库等配置都已经配置完成。
如果想让该文件支持注解,需要添加新的约束头,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"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">
</beans>
Ⅱ.🐇 注解实现IOC
2.1 @***ponent
2.1.1 作用
作用:用于创建对象,放入Spring容器,相当于 < bean id="" class=" " >
位置:类上方
tips:
1.要在配置文件中配置扫描的包,扫描到该注解才能生效。<context:***ponent-scan base-package="***.jackie"> </context:***ponent-scan>
2.@***ponent 注解配置bean的默认id是首字母小写的类名。也可以手动设置bean的id值。
2.1.2 对比与使用
eg1:
java"> @***ponent
public class StudentDaoImpl implements StudentDao{
public Student findById(int id) {
// 模拟根据id查询学生
return new Student(1,"Jackie","茂名");
}
}
eg2:
@***ponent("studentDao")
public class StudentDaoImpl implements StudentDao{
public Student findById(int id) {
// 模拟根据id查询学生
return new Student(1,"java","茂名");
}
}
此时eg1 bean的id为studentDaoImpl
此时eg2 bean的id为studentDao
2.2 @Repository、@Service、@Controller
2.2.1 作用
作用:这三个注解和@***ponent的作用一样,使用它们是为了区分该类属于什么层。
位置:
- @Repository用于Dao层
- @Service用于Service层
- @Controller用于Controller层
2.2.2 使用
@Repository
public class StudentDaoImpl implements StudentDao{}
@Service
public class StudentService {}
2.3 @Scope
2.3.1 作用
作用:指定bean的创建策略
位置:类上方
取值:singleton prototype request session globalsession
2.3.2 使用
@Service
@Scope("singleton")
public class StudentService {}
2.4 @Autowired
2.4.1 作用
作用:从容器中查找符合属性类型的对象自动注入属性中。用于代替 < bean >
中的依赖注入配置。
位置:属性上方、setter方法上方、构造方法上方。
2.4.2 使用
eg1:
@Autowired 写在属性上方进行依赖注入时,可以省略setter方法。
@***ponent
public class StudentService {
@Autowired
private StudentDao studentDao;
public Student findStudentById(int id){
return studentDao.findById(id);
}
}
@Test
public void t2(){
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
StudentService studentService = (StudentService) ac.getBean("studentService");
System.out.println(studentService.findStudentById(1));
}
eg2:容器中没有对应类型的对象会报错
// 如果StudentDaoImpl没有放到容器中会报错
//@***ponent("studentDao")
public class StudentDaoImpl implements StudentDao{
public Student findById(int id) {
// 模拟根据id查询学生
return new Student(1,"Jackie","茂名");
}
}
eg3:容器中有多个对象匹配类型时,会找beanId等于属性名的对象,找不 到会报错。
// 如果容器中都多个同类型对象,会根据id值等于属性名找对象
@***ponent("studentDao")
public class StudentDaoImpl implements StudentDao{
public Student findById(int id) {
// 模拟根据id查询学生
return new Student(1,"Jackie","茂名");
}
}
@***ponent
public class StudentDaoImpl implements StudentDao{
public Student findById(int id) {
// 模拟根据id查询学生
return new Student(1,"Jackie","茂名");
}
}
2.5 @Value
2.5.1 作用
作用:注入String类型和基本数据类型的属性值。
位置:属性上方
2.5.2 用法
eg1:直接设置固定的属性值
@Service
public class StudentService {
@Value("1")
private int count;
@Value("hello")
private String str;
}
eg2:获取配置文件中的属性值
- 编写配置文件db.properties
jdbc.username=root
jdbc.password=123456
- spring核心配置文件扫描配置文件
<context:property-placeholder location="db.properties">
</context:property-placeholder>
- 注入配置文件中的属性值
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
2.6 @Configuration
2.6.1 作用
作用:纯注解实现IOC需要一个Java类代替xml文件。这个Java类上方需要添 加@Configuration,表示该类是一个配置类,作用是代替配置文件。
位置:配置类上方
tips:
@Configuration 一般配合@***ponentScan(指定spring在初始化容器时扫描的包)使用。
2.6.2 用法
eg1:
@Configuration
@***ponentScan("***.jackie")
public class SpringConfig {
}
2.7 @PropertySource
2.7.1 作用
作用:代替配置文件中的 context:property-placeholder 扫描配置文件
位置:配置类上方
注意:配置文件位置前要加关键字 classpath
2.7.2 用法
@Configuration
@PropertySource("classpath:db.properties")
public class Jdb***onfig {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
2.8 @Bean
2.8.1 作用
作用:将方法的返回值对象放入Spring容器中。如果想将第三方类的对象放入容器,可以 使用@Bean
位置:配置类的方法上方。
属性:name:给bean对象设置id
tips:@Bean修饰的方法如果有参数,spring会根据参数类型从容器中查找可用对象。
2.8.2 用法
eg1:
如果想将jdbc连接对象放入Spring容器,因为我们无法修改Connection源码,所以无法添加@***ponent将其放到spring容器中,此时就需要使用将@Bean该对象放入Spring容器
将Connection对象放入Spring容器:
@Bean(name = "connection")
public Connection getConnection(){
try {
Class.forName("***.mysql.cj.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql:///mysql", "root", "root");
}catch (Exception e) {
return null;
}
}
三.🦁 总结
基于注解式开发spring,相对来说比较少,但是理解这些注解的作用,会对后面学习spring boot产生比较大的影响。所以还是应该重视一下,多用多做就能掌握啦。今天的分享到此结束,我是狮子,希望可以帮到您。