目录
1.存储Bean对象
1.1 添加注解的前提 (添加配置)
1.2 使用Spring注解存储Bean对象
1.2.1实例:@Controller(控制器存储)的使用
Bean对象:
启动类MainApp
执行结果
一些由于命名引发的问题(适用于五大类注解)
1.3 设置多种注解的原因
1.4 五大类注解之间的关系
1.5 Bean方法的命名规则
2. 获取
2.1 通过@Autowired进行属性注入
2.1.1 内容
2.1.2 缺点
2.2 setter注入
2.2.1 内容
编辑 2.2.2 缺点
2.2.3 优点
2.3 构造方法注入
2.3.1 内容
2.3.2 优点
2.4 方法注入的两个关键字(@Autowired和@Resourse)
2.5 同⼀类型多个 @Bean 报错
配置:将哪个路径下的所有包注入到Spring容器中。
介绍:可以使用Spring的@Component、@Service等注解将一个类标记为Spring的Bean,并由Spring容器管理。这样,对象的创建和销毁都由Spring容器控制,可以简化代码(不用去一个个写bean id="***"class="**")。
在Spring框架中,有几个重要的类级别注解可以用于描述Spring Bean。以下是其中一些常见的类注解:
1. `@Component`:组件。
2. `@Controller`:MVC控制器类
3. `@Service`:服务类。
4. `@Repository`:数据访问对象(DAO)类。
5. `@Configuration`:Java配置类,其中包含了一组Bean定义。
方法注解: @Bean
1.2.1实例:@Controller(控制器存储)的使用
Bean对象:
package com.demo.component; import org.springframework.stereotype.Controller; @Controller //有这个注解,在resourse资源里面就不用再设置bean id=" " class=" " ,在从Spring里面获取bean对象 //context.getBean("这里的内容就是类的名字首字母小写",类名.class); public class ArticleController { public String sayHello(){ return "Hello,Controller"; } }
启动类MainApp
import com.demo.component.ArticleController; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { // 加载Spring配置文件即创建Spring上下文; ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ArticleController articleController = context.getBean("articleController", ArticleController.class); System.out.println(articleController.sayHello()); } }
执行结果
默认规则都是首字母小写
1.如果类名首字母也是小写的,要如何从Spring中获取Bean?如名为 bController【没问题】
和首字母大写的情况一样;类名首字母小写。bController
原类名
2.如果首字母和第二个字母都是大写,如 BController,【️】如何获取Bean对象?
正确方式:使用原类名!!!BController
如果还是默认规则context.getBean("bController",BController.class)的结果:报错
当不管时
五大类注解用途
1.@ Controller (控制器):归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
2.@ Service (服务):归属于服务层,调用持久化类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】3.@ Repository (仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@ Repository .
4.@ Configuration (配置):归属于配置层,是用来配置当前项目的一些信息。5.Component(组件):归属于公共工具类,
◇
@component是其他四个类的父类
1.@Bean方法类注解必须搭配类注解使用;
2.Bean name 默认情况下是方法名;
3.不同类之间可以有相同的方法名,比如第一个类中人名”张三“,已经被加载过来,后续第二个类人名”李四“,使用 context.getBean("student",Student.class)打印出来的就只有张三,为了获取到李四,我们可以在@Bean注解后面添加如下代码,就可以通过context.getBean("s1",Student.class)来获取到!
但是当我们删除了“张三”对应的那个类,通过context.getBean("student",Student.class)来获取李四观察到获取不到?!
使用@Bean注解给对象进行重命名之后,此时就不能原方法名进行获取!
就相当于新车买回来是没牌的但是交警也会让你上路,但是发了新牌后,你把它取下来,那就!
这里不再使用new的方法,而是Spring框架赋值
- 无法注入不可变的对象(final修饰的对象);
- 只适用于loC容器;
- 更容易违背单一性设计原则;
假设有一个类A,需要依赖类B的实例,那么可以在类A的属性上添加@Autowired注解,并定义对应的setter方法:
public class A { private B b; @Autowired public void setB(B b) { this.b = b; } }
相对于属性注入的方法更加单一 ,每一个setter都只针对一个对象。
从Spring 4.x后就受到推荐。
规则:
当一个类中只有一个构造方法,可以省略@Autowired;
当一个类中有多个构造方法,必须加上@Autowired;
相同点:都是用来实现依赖注入的。
不同点:
1. 功能支持不同:@ Autowired 支持属性注入、 setter 注入、构造方法注入;@ Resource 支持属性、 setter 注入,但不支持构造方法注入。
2.出身不同:@ Autowired 来自 Spring 框架;而@ Resource 来自于 JDK .
3.参数支持不同:@ Resource 支持更多的参数设置;而@ Autowired 只支持 required 参数。
解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
- 使⽤ @Resource(name="user1") 定义。
- 使⽤ @Qualifier 注解定义名称。
在Spring中,如果你在同一个配置类中定义了多个相同类型的@Bean方法,会导致冲突,并引发错误。这是因为Spring无法确定应该使用哪个Bean。
解决这个问题的方法有两种:
1. 使用@Bean注解的name属性:
你可以给每个@Bean方法添加唯一的name属性,以区分它们。示例如下:@Configuration public class MyConfig { @Bean(name = "bean1") public MyBean myBean1() { return new MyBean(); } @Bean(name = "bean2") public MyBean myBean2() { return new MyBean(); } }
在其他地方需要使用特定的Bean时,可以通过指定名称来获取:
@Autowired @Qualifier("bean1") private MyBean myBean;
2. 使用不同的配置类或分离配置:
如果你希望有多个相同类型的Bean存在于应用程序中,可以将它们定义在不同的配置类中,或者将它们分离到不同的包下。这样每个配置类都负责定义自己特定的Bean,避免了冲突。示例:
@Configuration public class AppConfig1 { @Bean public MyBean myBean1() { return new MyBean(); } } @Configuration public class AppConfig2 { @Bean public MyBean myBean2() { return new MyBean(); } }
在其他地方需要使用特定的Bean时,可以按照需要选择相应的配置类进行引入。