一 spring注解的作用
1.1 作用
1.@Component: 注解表明一个类会作为组件类,并告知Spring要为这个类创建bean,使用 @Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。(相当于创建对象)
2.@Bean是一个注解,用于将一个方法标记为Spring容器中的一个Bean。具体来说,@Bean注解可以用于方法上,该方法返回一个对象,该对象将被Spring容器管理和提供给其他程序组件使用,让IOC容器知道这个组件存在。(相当于创建对象)
3.@Autowire:是组件和组件相互调用的时候,自动从ioc中取出来需要用的组件。(调用对象)
比如Service,Controller,Dao的关系,这三个组件都分别加上了注册的注解:@Service,@Controller,@Component,ioc中已经有了注册信息,但是Service要用到Dao操作数据,所以在Service中的Dao头上就要用@Autowired来给Dao自动赋值,来供Service用,同理,Controller中也要用到Service,那么就要在Service上边加上@Autowired
1.声明定义:TokenSotre对象
2.调用使用
1.2 @Component与@Bean的区别
@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
而@Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
@Component 作用于类,@Bean作用于方法。
相同点:两者的目的是一样的,都是注册bean到Spring容器中。
不同点:@Component和@Bean都是用来注册Bean并装配到Spring容器中,但是Bean比Component的自定义性更强。可以实现一些Component实现不了的自定义加载类。
1.3 @Bean的使用
- @Bean 注解作用在方法上
- @Bean 指示一个方法返回一个 Spring 容器管理的 Bean
- @Bean 方法名与返回类名一致,首字母小写
- @Bean 一般和 @Component 或者 @Configuration 一起使用
- @Bean 注解默认作用域为单例 singleton 作用域,可通过 @Scope(“prototype”) 设置为原型作用域
(1)默认情况下 Bean 名称就是方法名,比如下面 Bean 名称便是 myBean:
@Component
public Class ParamConfig{
@Bean
public MyBean myBean() {
return new MyBean();
}
}
(2)@Bean 注解支持设置别名。比如下面除了主名称 myBean 外,还有个别名 myBean1(两个都可以使用)
@Component
public Class ParamConfig{
@Bean("myBean1")
public MyBean myBean() {
return new MyBean();
}
}
二 spring的@Bean和@Component
2.1 描述
Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean。
完成这两个动作有三种方式,一种是使用自动配置的方式、一种是使用JavaConfig的方式,一种就是使用XML配置的方式。
2.2 使用自动配置模式
@Component
public class Student {
private String name = "lkm";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.3 使用java的config模式@Bean
@Bean 需要在配置类中使用,即类上需要加上@Configuration注解
@Configuration
public class WebSocketConfig {
@Bean
public Student student(){
return new Student();
}
}
2.4 调用
两者都可以通过@Autowired装配
@Autowired
Student student;
2.5 有@Component为何还需要@Bean呢?
如果你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component注解的,因此就不能使用自动化装配的方案了,但是我们可以使用@Bean,当然也可以使用XML配置。
三 @bean与@Component
3.1 结构
3.2 @Bean的使用:new一个普通类
1.B类:作为一个普通类,不引用其他类
2.C类:进行@bean的调用
3.调用:
3.3 @Bean的使用:在new的类中含有通过@Autowire引用其他类
1.A类
2.B类
b类中通过@Autowired引用其他类
3.c类
4.调用
报错:空指针
总结:有3.2 和3.3 这两个例子得出,通过@Bean方法new出的类B中含有@Autowire引用其他类,这里为类A;在B类调用A类不是通过new的方式,而是通过@Autowire放到spring容器的,这里通过在c类通过new方式调B类,B类无法new 到A类,报nullpointexception。
3.4 改为@Autowire调用
1.A
2.B 类
3. c类:通过@Autowired引用B类,B类通过@Autowired引用了A类,需要通过在c类中也通过@Autowire引用B类
4.调用