目录
一, 配置扫描路径
二, 为什么要使用注解及其关系
三, 通过类注解存储Bean
四, 类注解存储Bean的命名规则
五, 通过方法注解存储Bean
六, @Bean 重命名的几种方式
我们在rescourse目录下创建Spring的配置文件 spring-config.xml ,粘贴以下代码
然后在base-package里设置存储对象的扫描路径, 只有在设置了扫描路径的包里,并添加了注解的对象才能被存储到Spring里
目录在java包里开始,比如此处是java包里的Spring.demo包
作用都是一样的: 将Bean对象存储到Spring中
但不同的代码的功能是不同的,通过注解我们可以直观的区分出这些代码的用途是什么
就像车牌号,看到粤开头就知道是广东省的,看到闽就知道是福建省的
类注解:
@Controller 控制器. 接收前端传递过来的数据,校验数据的合法性(相当于安检系统)
@Service 服务 进行业务组装,判断实现某个业务的时候需要调用哪些方法(相当 于咨询中心)
@Repository 数据持久层 负责具体业务的实现,直接和数据库打交道
@Component 组件 存放一些项目需要的组件
@Configuration 配置层 设置一些项目的配置
其余类注解都是基于@Component 实现的
类注解演示: 以 @Controller 为例:
其他类注解用法相同,只需在类对象前加个注解即可,无需再在Spring配置文件上注入Bean,然后getBean()方法的第一个参数 填 类名的小写形式即可.
1.指定命名
2.使用默认命名
这种情况,就不能使用小写形式了,而是要用原类名才可
为什么会是这个样子,我们可以查看Spring源码
双击shift 进入类名搜索框
输入BeanName 找到 构造注解Bean名类
进去后找到构造Bean名方法,跳转进 buildDefaultBeanName
进去后发现返回的是 这个方法,再跳转进去
此处就是最低层的代码了
但移到第一行我们发现这个类是 java的包
点击左处的 定位标 可以发现是java jdk1.8里的方法
总结:
由此我们可以得出结论,Spring的类注解Bean命名规则是引用了java标准库中Bean的命名规则
五大类注解是注解在类之前,而方法注解是注解在方法之前
使用方法注解时,必须搭配五大类注解之一
创建一个文章实体类:
package Spring.demo;
import javax.swing.*;
import java.time.LocalDateTime;
public class Article {
String author;
String text;
LocalDateTime createTime;
public void setAuthor(String author) {
this.author = author;
}
public void setText(String text) {
this.text = text;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Article{" +
"author='" + author + '\'' +
", text='" + text + '\'' +
", createTime=" + createTime +
'}';
}
}
然后调用这个类的方法,此处使用了伪代码,实际开发中并不会这样写
方法上面加了 @Bean方法注解 , 并且在类上面加了 类注解@Controller
实现将这个方法注入到Spring中
package Spring.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import java.time.LocalDateTime;
@Controller
public class ArticleSpring {
@Bean
public Article getArticle(){
// 伪代码,实际开发不会这样写
Article article = new Article();
article.setAuthor("李大牛");
article.setText("锄禾日当午,飞流直下三千尺");
article.setCreateTime(LocalDateTime.now());
return article;
}
}
使用方法注解, 此时Bean对象的默认命名就是方法名
import Spring.demo.ArticleSpring;
import Spring.demo.Article;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
// 1.先得到 Spring 上下文对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2.得到bean对象 { 依赖查找 IoC的一种实现 }
Article article = context.getBean("getArticle",Article.class);
System.out.println(article);
}
}
运行后成功获得结果
在上一点中我们提到,使用@Bean方法注解的默认命名就是方法名
我们也可以指定命名:
例: 我们将Bean对象的名字指定为 "a33" 或 "a44" , 然后调用 "a44" 发现是可以成功读取到的
当我们对 Bean 对象重命名了之后,就无法再使用默认的方法名读取了
如果同一个类里,存在多个方法注解的名字相同,那么Spring会根据类加载顺序和类中代码从上至下的顺序注入第一个Bean,后面相同名字的@Bean 不会存放到Spring容器中
如果在不同的类中存在多个相同名字的Bean对象,我们可以通过 @order 来指定优先级,数值越大,越先将这个类的Bean对象注入
读取名字为 "a44" 的Bean , 得到的是 陈小猪
对调一下优先级,得到的就是李大牛了