介绍:配置一个类,将这个类交给Spring管理。
例如:以下就相当于
@Component(“book”)
代码:
@Component(“book”)
public class Book {
public int id=1;
public String name=“一心”;
}
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext(“bean1.xml”);
Book book=context.getBean(“book”, Book.class);
System.out.println(book.name);
}
2.2 @Value
作用:设置普通属性值
(1)可以不用提供set方法,直接在直接名上添加@value(“值”);
@Component(“book”)
public class Book {
@Value(“2”)
public int id;
@Value(“一心”)
public String name;
}
(2)如果提供了set方法,既可以在set方法上添加@value(“值”),也可以在属性名上添加@value(“值”);
@Component(“book”)
public class Book {
public int id;
@Value(“一心”)
public String name;
@Value(“2”)
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
2.3 衍生注解
@Component的三个衍生注解
目的:为了更好的进行分层。
作用:三者功能类似。
@Controller:web层
@Service:service层
@Repository:dao层
Controller
@Controller(“book”)
public class Book {
@Value(“2”)
public int id;
@Value(“一心”)
public String name;
}
Service
@Service(“book”)
public class Book {
@Value(“2”)
public int id;
@Value(“一心”)
public String name;
}
Repository
@Repository(“book”)
public class Book {
@Value(“2”)
public int id;
@Value(“一心”)
public String name;
}
自动装配:
准备:
实体类Book:
@Component(“book”)
public class Book {
@Value(“2”)
private int id;
@Value(“一心”)
private String name;
}
实体类Teacher:
@Component(“teacher”)
public class Teacher {
@Value(“1”)
private int id;
@Value(“王老师”)
private String name;
}
3.自动装配
==========
3.1 @Autowired
装配属性过程:
(1)spring会默认优先根据(被注解修饰的)属性类型去容器中找对应的组件(bean),找到就赋值;
(2)若找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找。
实体类Student:
@Component(“student”)
public class Student {
@Value(“一心同学”)
private String name;
@Autowired
private Teacher teacher;
@Autowired
private Book book;
}
3.2 @Qualifier注解
注意:不可以单独使用
可以和使用Autowired搭配使用:@Qualifier指定需要装配的组件的id,而不是使用属性名。
@Component(“student”)
public class Student {
@Value(“一心同学”)
private String name;
@Autowired
@Qualifier(“teacher”)//查找bean的id为teacher的类
private Teacher teacher;
@Autowired
@Qualifier(“book”)
private Book book;
}
使用@Qualifier注解的情况:
当IOC容器根据属性类型去容器中找找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找找不到时就是用这两个注解搭配,指定需要装配的bean的id。
3.3 @Resource注解
执行过程:
(1)@Resource如有指定的name属性,先按name进行配置文件Bean查找装配;
(2)没有指定name,则用默认的byName方式进行装配;
(3)如果(2)不成功,则按byType的方式自动装配。
(4)都不成功,则报异常。
@Component(“student”)
public class Student {
@Value(“一心同学”)
private String name;
@Resource(name = “teacher”)
private Teacher teacher;
@Resource(name =“book”)
private Book book;
}
3.4 @Autowired与@Resource异同
相同:两者都是实现自动装配功能,都可以写在字段上,或写在setter方法上。
不同:
(1)执行顺序不同,@Autowired(未指定name的情况下)先byType,再byName,@Resource先byName,再byType。
(2)@Resource中的name属性一旦指定,就只会按照名称进行装配。
(3)@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
(4)@Autowired是Spring定义的; @Resource是java规范。
4.@scope
========
作用范围:
-
singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
-
prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收。
@Component(“book”)
@Scope(“prototype”)
public class Book {
@Value(“2”)
private int id;
@Value(“一心”)
private String name;
}
4.2 配置初始化和销毁
@PostConstruct:对类进行初始化调用的方法
@PreDestroy:对类进行销毁调用的方法
代码:
@Component(“book”)
public class Book {
@Value(“2”)
private int id;
@Value(“一心”)
private String name;
@PostConstruct
public void init(){
System.out.println(“init----初始化”);
}
@PreDestroy
public void destroy(){
System.out.println(“destroy----销毁”);
}
}
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext(“bean1.xml”);
Book book=context.getBean(“book”,Book.class);
System.out.println(book);
((ClassPathXmlApplicationContext) context).close();
}
输出:
5.基于Java类进行配置
===================
介绍:通过 Java 类的方式提供 Bean 的定义信息
(1)编写实体类Book
@Component(“book”)
public class Book {
@Value(“2”)
private int id;
@Value(“一心”)
private String name;
}
(2)新建一个config配置包,编写一个MyConfig配置类
@Configuration//代表这是一个配置类
public class MyConfig {
@Bean//通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
public Book book(){
return new Book();
}
}
测试:
@Test
public void test2(){
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
类Book**
@Component(“book”)
public class Book {
@Value(“2”)
private int id;
@Value(“一心”)
private String name;
}
(2)新建一个config配置包,编写一个MyConfig配置类
@Configuration//代表这是一个配置类
public class MyConfig {
@Bean//通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
public Book book(){
return new Book();
}
}
测试:
@Test
public void test2(){
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-tVWySAjM-1721155121665)]