java 扫描系统_JAVA_OA管理系统(四):基于注解的组件扫描

总述

有关:

本篇文章是和(三)紧挨着的兄弟文章,代码同样是(三)中的那些。

内容(这篇只是一些新手入门,进阶请看番外)

1  什么是组件扫描

2  指定扫描类路径

3  自动扫描的注解标记

4  自动扫描注解命名

5  指定组件的作用域

6  指定初始化和销毁方法

7  指定依赖注入关系

8  注入spring的表达式

1  什么是组件扫描

指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义

前有特定的注解标记时,就将该组件纳入到Spring容器中,等价于原来的XML配置bean

的功能。

2  指定扫描类路径

使用组件扫描,首先需要在XML配置中指定扫描父级package路径,容器会自动去扫描

Com.throne包及其自包下的所有组件,并且实例化bean

而我们的(三)中的java包都在该路径下;

3  自动扫描的注解标记

指定扫描的类路径后,并且不是所有的该路径下的组件都会被扫描到Spring容器,

只有在组件类定义前有一下标记的,才会扫描到Spring容器。

5969c19505cb80be84eaeb62535a9b4c.png

4  自动扫描注解命名(需要导入webMVC的jar包)

当一个组件在扫描过程中被检测到时,会生成一个默认的id值,默认id值为小写

开头的类名,也可以在注解中自定义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权威指南// .getBook().getName()*/

常用于,减少代码量,进行对象注入。

注意点:

1) @Resouce是JAVAEE中的,建议使用降低与spring的耦合,而@Autowired是Spring中的。

2)@Autowired查找类型是“byType”,@Resouce是"byName",@Qualifier("XXX")与@Autowired配合可以将byType转为byName,其中XXX为name;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值