Spring--注解回顾
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring--注解回顾相关的知识,希望对你有一定的参考价值。
1. Spring--注解回顾
Spring学完了有一段时间了,有时候,看到Spring里面的某些注解时会有点模棱两可的感觉,趁着今天周末,我就来回顾一下Spring相关的注解。
从广义上Spring注解可以分为两类:
- 用于注册Bean
- 用于使用Bean
1.1 用于注册Bean的注解
假如IOC容器就是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部
搬运食材和餐具进来。这里把某一样食材或者某一样餐具搬进空屋子的操作就相当于每个注
册Bean的注解作用类似。注册Bean的注解作用就是往IOC容器中放(注册)东西! 用于注册。
注册Bean的注解: 比如@Component , @Repository , @ Controller , @Service , @Configration
这些注解就是用于注册Bean,放进IOC容器中,一来交给spring管理方便解耦,二来还可以
进行二次使用(IOC容器中已经存在,就可以只要拿去用,而不必再去注册)。
补充:
为了更好的进行分层,Spring可以使用其它三个注解,功能同@Component,目前使用哪一个功能都一样。
- @Controller:web层
- @Service:service层
- @Repository:dao层
- @Configration:代表这是一个配置类
写上这些注解,就相当于将这个类交给Spring管理装配了!
1.2 用于使用Bean的注解
用于使用Bean的注解:比如@Autowired , @Resource注解,这些注解就是把IOC容器中东西
自己拿来用,如果你要拿,前提 IOC容器 里有的,不然就会报错。
1.3 @Bean注解概述
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管
理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象
放在自己的IOC容器中。@Bean明确地指示了一种方法,什么方法呢?产生一个bean的方
法,并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了,因为
它很明确地告诉被注解的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别
管了。记住,@Bean就放在方法上,就是让方法去产生一个Bean,然后交给Spring容器。
实际上,@Bean注解和xml配置中的bean标签的作用是一样的。
1.4 @Bean注解概述示例:
首先,先定义一个实体类
Dog.java
package com.tian.pojo;
public class Dog {
public String name = "dog";
}
开始测试
TestAnno.java
package com.tian.config;
import com.tian.pojo.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
public class TestAnno {
/**
* 通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id
*/
@Bean
public Dog getDog() {
return new Dog();
}
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestAnno.class);
// 这里传入的参数就是刚刚的方法名
Dog dog = (Dog) applicationContext.getBean("getDog");
System.out.println(dog.name);
}
}
这段代码的运行结果为:
1.5 为什么要有@Bean注解
不知道大家有没有想过,用于注册Bean的注解的有那么多个,为何还要出现@Bean注解?
原因很简单:类似@Component , @Repository , @ Controller , @Service 这些注册Bean的
注解存在局限性,只能局限作用于自己编写的类,如果是一个jar包第三方库要加入IOC容器
的话,这些注解就手无缚鸡之力了,是的,@Bean注解就可以做到这一点!当然除了@Bean
注解能做到还有@Import也能把第三方库中的类实例交给spring管理,而且@Import更加方便
快捷。
使用@Bean注解的另一个好处就是能够动态获取一个Bean对象,能够根据环境不同得到不同的Bean对象。
1.6 @Bean注解总结
- Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
- @Component , @Repository , @ Controller , @Service 这些注解只局限于自己编写的类,而@Bean注解能把第三方库中的类实例加入IOC容器中并交给spring管理。
- @Bean注解的另一个好处就是能够动态获取一个Bean对象,能够根据环境不同得到不同的Bean对象。
- 记住,@Bean就放在方法上,就是让方法去产生一个Bean,然后交给Spring容器,剩下的你就别管了。
1.7 上面讲的都是注册Bean,下面来讲一下自动装配。
自动装配是使用spring满足bean依赖的一种方法
spring会在应用上下文中为某个bean寻找其依赖的bean。 Spring中bean有三种装配机制,分别是:
- 在xml中显式配置;
- 在java中显式配置;
- 隐式的bean发现机制和自动装配。
这里我们主要讲第三种:自动化的装配bean。
Spring的自动装配需要从两个角度来实现,或者说是两个操作:
- 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
- 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;
组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。
1.7.1 User类加构造方法
Dog.java
package com.tian.pojo;
import org.springframework.stereotype.Component;
@Component
public class Dog {
public String name = "dog";
}
User.java
package com.tian.pojo;
import org.springframework.stereotype.Component;
/**
* ClassName: User
* Description: 这里创建了一个User类 , 里面有一个 dog 的属性
*
* @author Administrator
* @date 2021/6/5 23:11
*/
@Component
public class User {
private Dog dog;
public User(Dog dog) {
this.dog = dog;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
测试类
TestAnno.java
package com.tian.config;
import com.tian.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* 组件扫描: spring会自动发现应用上下文中所创建的bean
*/
@ComponentScan("com.tian.pojo")
public class TestAnno {
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestAnno.class);
// 这里传入的参数就是刚刚的方法名
User user = (User) applicationContext.getBean("user");
System.out.println(user.getDog().name);
}
}
运行结果:
1.7.2 User类不加构造方法
Dog.java
package com.tian.pojo;
import org.springframework.stereotype.Component;
@Component
public class Dog {
public String name = "dog";
}
User.java
package com.tian.pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* ClassName: User
* Description: 这里创建了一个User类 , 里面有一个 dog 的属性
*
* @author Administrator
* @date 2021/6/5 23:11
*/
@Component
public class User {
// 加了 @Autowired 后 ,可以不包含dog的构造方法
@Autowired
private Dog dog;
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
测试类
TestAnno.java
package com.tian.config;
import com.tian.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* 组件扫描: spring会自动发现应用上下文中所创建的bean
*/
@ComponentScan("com.tian.pojo")
public class TestAnno {
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestAnno.class);
// 这里传入的参数就是刚刚的方法名
User user = (User) applicationContext.getBean("user");
System.out.println(user.getDog().name);
}
}
运行结果:
以上是关于Spring--注解回顾的主要内容,如果未能解决你的问题,请参考以下文章
Spring(注解+依赖注入+无配置注解+AOP)适合回顾♥♥
第298天学习打卡(知识点回顾 springboot核心注解 spring bean的生命周期)
第298天学习打卡(知识点回顾 springboot核心注解 spring bean的生命周期)