总述
有关:
内容(这篇只是一些新手入门,进阶请看番外)
1 什么是组件扫描
2 指定扫描类路径3 自动扫描的注解标记
4 自动扫描注解命名
5 指定组件的作用域
6 指定初始化和销毁方法
7 指定依赖注入关系
8 注入spring的表达式
1 什么是组件扫描
指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器中,等价于原来的XML配置bean
的功能。
2 指定扫描类路径
使用组件扫描,首先需要在XML配置中指定扫描父级package路径,容器会自动去扫描Com.throne包及其自包下的所有组件,并且实例化bean
3 自动扫描的注解标记
指定扫描的类路径后,并且不是所有的该路径下的组件都会被扫描到Spring容器,只有在组件类定义前有一下标记的,才会扫描到Spring容器。
4 自动扫描注解命名(需要导入webMVC的jar包)
开头的类名,也可以在注解中自定义id。注意:使用注解既然要导入jar包,那么自然要import jar包;
//比如我们之前的Book类 @Component("book") public class Book implements Serializable{ //属性-->也是注解来注入的 @Value("100") private String bookPrice; @Value("hadoop权威指南") private String bookName; //getter and setter } //至于获取,则变为注解时添加的ID Book b1=ac.getBean("book",Book.class);//没有添加id时,为默认的小写首字母的类名(类的规范:首字母大写) System.out.println(s.getBook().getBookName()); System.out.println(s.getBook().getBookId()); 结果: hadoop权威指南 100
这时则不需要再配置xml文件中的bean,因此可见通过更方便的注解来代替原来的xml文件配置,则大大简化编程流程。
5 指定组件的作用域
Spring管理的组件,默认的作用域是”singleton”(单例模式),如果需要其他的作用域也可以使用@Scope注解,只要在注解中提供作用域的名称即可,此处属性值与(二)中所讲的是一样的。
//比如我们之前的Book类 @Component("book") public class Book implements Serializable{ //属性-->也是注解来注入的 @Value("100") private String bookPrice; @Value("hadoop权威指南") private String bookName; //getter and setter } //至于获取,则变为注解时添加的ID Book b1=ac.getBean("book",Book.class); Book b2=ac.getBean("book",Book.class); System.out.println(b1==b2); 结果: true 而 @Component("book") @Scope("prototype") public class Book implements Serializable{ } System.out.println(b1==b2); 此时运行结果则为: false
6 指定初始化和销毁方法 (了解即可)
@PostConstruct 指定初始化方法@PreDestroy 指定销毁方法
注意:但单例的时候才能关闭,多例时没有关闭
AbstractApplicationContext才有销毁,他是ApplicationContext的父类,(二)中提过;
@PostConstruct public void init(){ System.out.println("Book被 初始化了"); } @PreDestroy public void destroy(){ System.out.println("Book被销毁了"); }
7 指定依赖注入关系
具有依赖关系的bean对象,利用下面任意一种注解都可以实现关系的注入基本类型的值注入可以使用 @value() 标记
// @Component(通用注解,当你不知道用什么的时候,可以试试这个)
具有依赖关系的bean对象,利用下面任意一种注解都可以实现关系的注入
注意: Setter注入推荐使用@Resource 构造器推荐使用@Autowired
1 @Autowired/@Qualifier 可以处理构造器注入和Setter注入
@Autowired写在构造器前面,申明需要为其注入bean
@Qualifier写在参数 前面,申明需要注入的bean的id
// 这样可以减少代码量,简化编写流程。
详细的可以看这篇文章(这篇文章的代码比较详细):
@Autowired写在属性上面 只会执行构造器的一句 赋值 不会全部执行
如果在单例模式中 @Qualifier可以省略
2 @Autowired也可以写在set方法上面
注入对象单例时,@Qualifier可以省略。此时,Spring按照类型匹配参数。
@Autowired也可以写在属性上,作用和写在set方法上类似,但只会执行
赋值语句
3 使用@Resouce注解
只能用在set方法上和属性上,用在set 方法中 ,执行所有的方法体(
比如
在setter中添加一句:System.out.println("我在set中被@Resouce执行了!");
那么在执行zhegeset时,就会在控制台打印输出这句话。
),用在属性上
只执行方法的赋值
//假如在一个类(比如是store)中这样写,也就是将@Resource,写在 类名 名字;前 @Resource private Book book; // 此时,该类将会获得其中的方法 String str="applicationContext.xml"; ApplicationContext ac=new ClassPathXmlApplicationContext(str); Store s=ac.getBean("store",Teacher.class); System.out.println(s.getBook().getName()); @Component("book")//这是此时的Book类 public class Book implements Serializable{ @Value("100") private String bookId; @Value("hadoop权威指南") private String bookName; public Book() { System.out.println("我创建了"); } public String getBookId() { return bookId; } public void setBookId(String bookId) { this.bookId = bookId; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } @PostConstruct public void init(){ System.out.println("我被初始化了"); } @PreDestroy public void destroy(){ System.out.println("我被销毁了"); } } /*则会输出: 我创建了// 创建Book 我被初始化了// init() hadoop权威指南// <span style="font-family: Arial, Helvetica, sans-serif;">.getBook().getName()*/</span>
常用于,减少代码量,进行对象注入。
注意点:
1) @Resouce是JAVAEE中的,建议使用降低与spring的耦合,而@Autowired是Spring中的。
2)@Autowired查找类型是“byType”,@Resouce是"byName",@Qualifier("XXX")与@Autowired配合可以将byType转为byName,其中XXX为name;