Spring 更简单的读取和存储Bean【注解篇,属性注入,set注入,构造方法注入】

news/2024/11/29 6:31:49/

更加简单的存取Bean对象:

一. 五大类注解和一个方法注解

        @Controllor:控制器,验证用户请求数据的正确性;【安保】

        @Service:服务层,编排和调度具体的执行方法;【服务台】

        @Repository:持久层,数据访问层,与数据库做交互;【执行者,数据访问】

        @Component:组件,存放工具类;【工具】

        @Configuration:配置项【基础配置】

        @Bean【唯一的方法注解】

二.spring-config中配置扫描路径

<?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:content="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 https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.bit.service"></content:component-scan> 
</beans>

 其中,在com.bit.service中的类添加了五大类注解,可以被添加到Spring容器中,其他没在配置文件中扫描的路径,无法被添加到Spring容器

三、方法注解@Bean存取对象

默认情况下,原类名的首字母小写【小驼峰】或原类名【开头两个及以上的字母均为大写】

3.1存对象 

@Component
public class UserBeans {@Beanpublic Student student1(){Student student = new Student();student.setAge(18);student.setId(210210210);student.setName("zhangsan");return student;}@Beanpublic Teacher teacher1(){Teacher teacher = new Teacher();teacher.setAge(25);teacher.setId(22222222);teacher.setName("老师");return teacher;}
}

存对象:在上述student1()和teacher1()方法中,都加了@Bean注解,该注解的作用是将被其修饰的方法的返回值存放到 Spring 中 

 3.2取对象

public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Teacher teacher = context.getBean("teacher1",Teacher.class);teacher.sayHi();}

取对象:将@Bean修饰的方法名和类型传给上下文对象进行获取 

注意:<bean>方法注解

1.  ①方法名就是->实体名 ②类要有五大类注解,配合使用 ③必须要有返回值

2. <bean name={"","",""}> <bean value={"","",""}> 重命名,可以起多个名字

3. 当重命名之后,原方法名就不能获取到对象了 

4. 允许同样的对象在Spring中存储多个  

5. 存在不同方法中方法名相同且都被Bean修饰,可以通过@Order(int) 改变注入顺序,越小优先级越高 

6. <bean>可不可以和<component-scan>包下同时使用------>可以

四、更简单的读取Bean【不能在启动类使用 static的优先级高于Spring】

1.属性注入  先判断类型读取,当有多个就根据起的变量名字进行读取【在属性上@Autowired】

缺点:①没办法实现final修饰的的变量注入②只适用于IoC中(兼容性不好)③违背单一设计原则概率更大

 【UserService代码(伪代码)】

@Service
public class UserService {public Teacher getUserById(int id){//......Teacher teacher =new Teacher();teacher.setId(22);System.out.println("UserService->getUserId");return teacher;}
}

  【StudentController代码】

@Controller //将当前类存储到Spring中
public class StudentController {@Autowiredprivate UserService userService;public void sayHi(){System.out.println("Student Hi~");}public Teacher getById(int id){return userService.getUserById(id);}
}

 【启动类】

public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//        Teacher teacher = context.getBean("teacher1",Teacher.class);
//        teacher.sayHi();StudentController studentController = context.getBean(StudentController.class);studentController.getById(59);}

其中体现是属性注入 的语句是:在属性上直接添加了@Autowired注解,直接从Spring容器中获取

2.Setter注入【普通的set方法】【在set方法上加@Autowired】

利用@Autowired给方法,可以给方法的参数中的对象进行注入

优点:每次只传递一个对象,符合单一设计原则

缺点:①没办法实现final修饰的的变量注入②使用Setter注入的对象可能会被修改

@Controller //将当前类存储到Spring中
public class StudentController {private UserService userService;//set注入@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void sayHi(){System.out.println("Student Hi~");}public Teacher getById(int id){return userService.getUserById(id);}
}

区别于属性注入在于在set方法上加上@Autowired 

3.构造方法注入(Spring官方推荐)【构造方法上加@Autowired】

如果仅有一个构造方法,可以不加@Autowired

优点:1.可以注入final的对象2.注入对象不会被改变(构造方法只执行一次)3.可以保证注入对象完全被初始化4.通用性更好 

@Controller //将当前类存储到Spring中
public class StudentController {//构造方法注入private UserService userService;@Autowiredpublic StudentController(UserService userService) {this.userService = userService;}public void sayHi(){System.out.println("Student Hi~");}public Teacher getById(int id){return userService.getUserById(id);}
}

在构造方法上加入@Autowired 

问题:为什么构造方法可以注入一个不可变的对象,而属性注入和Setter不行?

答:在 Java 中规定被 final 对象必须满足一下两个条件的其中一个

①创建时直接赋值②构造方法赋值


http://www.ppmy.cn/news/1141078.html

相关文章

高精度NTP时钟服务器(时间同步服务器)技术方案探讨

高精度NTP时钟服务器&#xff08;时间同步服务器&#xff09;技术方案探讨 高精度NTP时钟服务器&#xff08;时间同步服务器&#xff09;技术方案探讨 四分天下目前&#xff0c;全球的 GPS卫星同步系统处于“四分天下”状态&#xff0c;以美俄两国的系统处于领导地位&#xff…

第10讲:Vue组件的定义与注册

定义组件 1. 在程序的 components 目录下新建一个名为 Child.vue 的文件 2. 在文件内键入如下代码 <template><div>Child</div> </template> <script> export default {name: Child } </script>新建的 Child .vue 文件即为我们定义的组件…

1.6 IntelliJ IDEA开发工具

前言&#xff1a; ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**&#xff1a; - 使用基础文本编辑器如记事本编写Java代码虽然可行&#xff0c;但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

SpringCloud学习笔记-Eureka服务的搭建

目录 1.首先引入依赖2.main中配置注解3.src/main/resources/application.yml配置文件 本文的主要工作是介绍如何搭建一个Eureka服务 1.首先引入依赖 pom文件中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring…

郁金香2021年游戏辅助技术中级班(七)

郁金香2021年游戏辅助技术中级班&#xff08;七&#xff09; 058-C,C写代码HOOK分析封包数据格式A059-C,C写代码HOOK分析封包数据格式B-detours劫持060-C,C写代码HOOK分析封包数据格式C-过滤和格式化061-C,C写代码HOOK分析封包数据格式D-写入配置文件062-C,C写代码HOOK分析封包…

YOLOv8血细胞检测(6):多维协作注意模块MCA | 原创独家创新首发

💡💡💡本文改进:多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM,创新性十足,可直接作为创新点使用。 MCA | 亲测在血细胞检测项目中涨点,map@0.5 从原始0.895提升至0.910 收录专栏: 💡💡💡YOLO医学影像检测:http://t.csdnimg.cn/N4zBP ✨✨✨实战医学影…

es官方为我们提供的堆内存保护机制-熔断器( breaker )

总熔断器&#xff08;相当于似乎总闸&#xff09; 参数&#xff1a; indices.breaker.total.use_real_memory 默认值&#xff1a;true 在 elasticsearch.yml中配置。 参数&#xff1a; indices.breaker.total.limit 如果 indices.breaker.total.use_real_memory : true, in…

40V汽车级P沟道MOSFET SQ4401EY-T1_GE3 工作原理、特性参数、封装形式—节省PCB空间,更可靠

AEC-Q101车规认证是一种基于失效机制的分立半导体应用测试认证规范。它是为了确保在汽车领域使用的分立半导体器件能够在严苛的环境条件下正常运行和长期可靠性而制定的。AEC-Q101认证包括一系列的失效机制和应力测试&#xff0c;以验证器件在高温、湿度、振动等恶劣条件下的可…