Spring_4_使用注解来简化配置文件

组件扫描

容器会扫描指定的包及其子包下面的所有的类,如果该类前面有特定的注解比如@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;
	}	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值