bean名命名由两部分组成:五大注解(类注解)和@Bean方法注解。这两种方式各有各的有点。
五大注解
@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应。
@Configuration:配置层. 处理项⽬中的⼀些配置信息。
@Service:业务逻辑层, 处理具体的业务逻辑。
@Repository:数据访问层,也称为持久层. 负责数据访问操作。
@Component: 这个注解是万能注解,可以代替上面的任何一个注解。
Spring是一种IOC容器,当我们使用这些类注解,将相当于把这些类交给了Spring进行管理,在以前的学习中如果我们不加一些注解就无法在Spring运行的时候再前端找到一些端口。
我们可以观察除了@Component注解外的其余的注解,他们都是@Component的子注解。这就说明这四种注解也具备了@Component的功能并且也进行了一些的拓展,但当使用时任然是具备@Component的功能。
接下来我们来介绍这些注解的使用,由于这四种注解在将bean放入IOC容器中的作用是一致的并且使用方法也大差不差因此我们在这里值单独的介绍其中的一个即可。
由于@Component是其他四种注解的元注解,因此在这里我么只讲解@Component注解。
使用IOC容器(“控制反转”容器)的原因就是因为避免当底层的一些代码更改时,需要整个调用调用链上的代码都需要修改的情况(程序的耦合性非常高)。
使用Bean注解就可以将bean方到IOC容器中进行管理,当我们需要的时候就可以在里面取出bean使用。
取出这些bean我们还需要用到ApplicationContext获取Bean,我们创造一个简单的类User,并加上@Component注解,使其放入到容器当中:
@Component
public class User {public int Age;public String Name;}
接着在启动类中使用ApplicationContext获取Bean。
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext run = SpringApplication.run(DemoApplication.class, args);}}
此时我们就可以通过ApplicationContext的对象通过getBean()来获取IOC容器中的对象,但需哟特别注意的的是getBean()有多个重载方法,在这里我们仅仅只需要了解和使用其中你的三个即可。
我们只需要了解第一个,第二个和第三个即可:
我们先介绍第二个,:
<T> T getBean(Class<T> requiredType) throws BeansException;
通过一个类型,获取Bean,由于之前我们之前创造一个User并且使用@Component将其放入到IOC容器中,因此如果我们想使用第二种方法取出这个对象就需要传入一个“类型”也就是User.class:
@SpringBootApplication
public class Demo1Application {public static void main(String[] args) {ApplicationContext applicationContext = SpringApplication.run(Demo1Application.class, args);User bean = applicationContext.getBean(User.class);bean.run();}}
获取到User对象之后调用run()方法:
通过此处我们就可以看到我们成功的取出了User对象。当然如果将@Component换成其他的几个注解也是可以的:
@Service
public class User {public int Age;public String Name;public void run(){System.out.println("running_User");}}
结果依旧是没有任何变化;
@Bean注解
类注解是添加到某个类上的, 但是存在两个问题:
1. 使⽤外部包⾥的类, 没办法添加类注解
2. ⼀个类, 需要多个对象, ⽐如多个数据源
这种场景, 我们就需要使⽤⽅法注解 @Bean
public class BeanConfig {
@Bean
public User user(){
User user = new User();
user.setName("zhangsan");
user.setAge(18);
return user;
}
}
当我们使用@Bean时我们会发现我们根本获取不到,这是因为@Bean(方法注解)必须要配合类注解一起使用,才可以生效。
@Component
public class BeanConfig {
@Bean
public User user(){
User user = new User();
user.setName("zhangsan");
user.setAge(18);
return user;
}
}
当我们回去这个对象并输出user对象时:
定义多个对象 :
当我们要定义多个对象时,我们如果按照正常的定义方式会抛出异常
简单来说就是我们想要拿一个但是发现了两个,我们不知道拿那一个,因此抛出异常,此时我们就需要一种特殊的方法,给bean命名。
此时我们想要获取对象就需要第三种方法了,通过名字和类型来获取Bean
此时我们就可以正常输出了:
第一种获取方式为通过命名来获取Bean