组件扫描
容器会扫描指定的包及其子包下面的所有的类,如果该类前面有特定的注解比如@Component),则容器会将其纳入容器进行管
(相当于在配置文件里面有一个bean元素)。
<!-- 配置组件扫描 -->
<!--
base-package属性:指定的包
容器会扫描指定的包及其子包下面所有的类(组件),并实例化为bean
如果该类前面有特定的注解(比如 @Component),
则容器会将其纳入容器进行管理(相当于在配置文件里面有一个bean元素)
组件扫描可以替代大量XML配置的<bean>定义
-->
<context:component-scan base-package="annotation"/>
<context:component-scan base-package="depenInject"/>
<context:component-scan base-package="constructor"/>
<context:component-scan base-package="set"/>
<context:component-scan base-package="value"/>
<util:properties id="config" location="classpath:config.properties"/>
/**
* 容器会扫描指定的包及其子包下面的所有的类,如果该类前面有特定的注解比如@Component),
* 则容器会将其纳入容器进行管理(相当于在配置文件里面有一个bean元素)。
* bean的id默认缺省情况下等于id是首字母小写之后的类名 someBean
* @Component("beanID") 指定bean的id
* @Scope("prototype")该注解指定作用域
* @author Administrator
* @PostConstruct 该注解指定初始化方法
* @PreDestroy 该注解指定销毁方法,销毁之前执行的方法
* @Lazy(true) 延迟加载
*/
@Component("sb1")
@Scope("singleton")
@Lazy(true)
public class SomeBean {
@PreDestroy
//销毁方法只对作用域为singleton的bean有效。
public void destroy() {
System.out.println("destroy()");
}
@PostConstruct
public void init() {//若无法导包需指定tomcat为运行环境
System.out.println("init()");
}
public SomeBean() {
System.out.println("SomeBean()");
}
}
//测试组件扫描
@Test
public void test1() {
ApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml");
SomeBean sb1 = ac.getBean("sb1", SomeBean.class);
System.out.println(sb1);
}
//测试作用域注解
@Test
public void test2() {
ApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml");
SomeBean sb1 = ac.getBean("sb1", SomeBean.class);
SomeBean sb2 = ac.getBean("sb1", SomeBean.class);
System.out.println(sb1==sb2);
}
//测试生命周期注解
@Test
public void test3() {
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml");
SomeBean sb1 = ac.getBean("sb1", SomeBean.class);
ac.close();
}
//测试延迟加载注解
@Test
public void test4() {
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml");
/*SomeBean sb1 = ac.getBean("sb1", SomeBean.class);
ac.close();*/
}
依赖注入相关的注解
1)@Autowired @Qualifier
注:该注解支持set方法和构造器注入。
/**
* 测试注解 @Autowired @Qualifier()
* 注入到Restaurant类
* @author Administrator
* https://blog.csdn.net/heyutao007/article/details/5981555
*
*/
@Component("wt")
public class Waiter {
public Waiter() {
System.out.println("Waiter()");
}
}
/**
* 演示使用注解进行set注入
* @Autowired @Qualifier
* 注:该注解支持set方法和构造器注入。
* @Autowired 默认按类型装配byType
* @Qualifier("beanID") 被注入对象的ID,byName
* 当时有set方式注入时,可以将@Autowired添加到set方法前面,如果不使用@Qualifier("beanID"),
* 则容器会使用byType的方式注入,有可能出错,所以建议使用@Qualifier("beanID")注解明确指定要注入
* 的bean的id。
* @author Administrator
*
*/
@Component("rest")
public class Restaurant {
@Autowired
@Qualifier("wt")
private Waiter waiter;//this.waiter=waiter
public Restaurant() {
System.out.println("Restaurant()");
}
/*@Autowired
public void setWaiter(@Qualifier("wt") Waiter waiter) {
System.out.println("setWaiter(Waiter waiter)");
this.waiter = waiter;
}*/
@Override
public String toString() {
return "Restaurant [waiter=" + waiter + "]";
}
}
构造器注入
/**
* 使用注解进行构造器注入
* @author Administrator
*
*/
@Component("school")
public class School {
private Waiter waiter;
public School() {
System.out.println("School()");
}
@Autowired
public School(@Qualifier("wt") Waiter waiter) {
System.out.println("School(Waiter waiter)");
this.waiter = waiter;
}
@Override
public String toString() {
return "School [waiter=" + waiter + "]";
}
}
set注入
2)@Resource
注:该注解只支持set方法注入。
/**
* 酒吧类
* 测试使用注解@Resource进行set注入,默认按 byName
* @Resource(name="被注入的beanid") name属性为被注入的bean的id
* 注:该注解只支持set方法注入。
* 放在set方法前,也可以放在属性前,放在属性前只是赋值this.waiter=waiter
* @author Administrator
*
*/
@Component("bar")
public class Bar {
@Resource(name="wt")
private Waiter waiter;
public Bar() {
System.out.println("Bar()");
}
/*@Resource(name="wt")
public void setWaiter(Waiter waiter) {
System.out.println("setWaiter(Waiter waiter)");
this.waiter = waiter;
}*/
@Override
public String toString() {
return "Bar [waiter=" + waiter + "]";
}
}
注入基本类型的值和spring表达式的值
<util:properties id="config" location="classpath:config.properties"/>
/**
* 使用spring表达式
* @Value("#{config.pageSize}")
* 该注解不仅可以用spring表达式,也可以直接注入基本类型的值
* 还可以放到set方法前
* @author Administrator
*
*/
@Component("manager")
public class Manager {
@Value("#{config.pageSize}")
private String pageSize;
@Value("伊莲娜")
private String name;
private String max;
public Manager() {
System.out.println("Manager()");
}
@Override
public String toString() {
return "Manager [pageSize=" + pageSize + ", name=" + name + ", max=" + max + "]";
}
@Value("#{config.max}")
public void setMax(String max) {
System.out.println("setMax(String max)");
this.max = max;
}
}