layout: post
title: spring2
subtitle: 注解
date: 2018-06-14
author: ZL
header-img: img/20180614.jpg
catalog: true
tags:
- spring
- 注解
注解简化配置
用处
用注解可以代替applicationContext.xml中的一些配置。
<!--像这些配置都可以用注解代替-->
<bean name="car" class="cn.itcast.bean.Car" >
<property name="name" value="布加迪威龙" ></property>
<property name="color" value="black" ></property>
</bean>
使用注解的准备工作
导包
正常的spring包+spring-aop

新的xml约束(content)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
applicationContext.xml中配置
<!-- 指定扫描cn.itcast.bean报下的所有类中的注解.
注意:扫描包时.会扫描指定包下的所有子孙包
-->
<context:component-scan base-package="cn.itcast.bean"></context:component-scan>
使用
注册对象
@Component("user")
//@Service("user") // service层
//@Controller("user") // web层
//@Repository("user")// dao层
public class User {
private String name;
private Integer age;
private Car car;
....
...
}
等效于
<bean name="user" class="cn.itcast.bean.User" />
Component、Service、Controller、Repository的作用完全一样,只是名字不一样,可以用来区分不同的Bean类所处的层次,方便开发者搞清楚类的作用。service在service层,Controller在web层,Repository在dao层。
使用的话还是和以前一样
//1 创建容器对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 向容器"要"user对象
User u1 = (User) ac.getBean("user");
修改对象的作用范围(默认单例)
@Scope(scopeName="singleton")
public class User {
private String name;
private Integer age;
private Car car;
....
...
}
属性的值注入
public class User {
@Value("tom") //方式一
private String name;
private Integer age;
private Car car;
....
@Value("tom") //方式二
public void setName(String name) {
this.name = name;
}
...
}
两种方式都可以
还可以引资源文件的值@InportResource和@Value组合使用

然后在xml里面引入资源文件地址

引用类型的属性的值注入
public class User {
private String name;
private Integer age;
//@Autowired //自动装配
//问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
//@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象
@Resource(name="car")//手动注入,指定注入哪个名称的对象
private Car car;
....
...
}
Autowired自动装配,如果car的引用类型只有一个,可以使用,如果有多个,就不好用。比如
<bean name="car1" class="cn.itcast.bean.Car"/>
<bean name="car2" class="cn.itcast.bean.Car"/>
Qualifier和Resource都可以直接指定名称,推荐使用
Autowired和Resource都可以单独使用,Qualifier不能单独使用,要和Autowired结合在一起使用。


初始化和销毁时的方法
public class User {
....
@PostConstruct //在对象被创建后调用.init-method
public void init(){
System.out.println("我是初始化方法!");
}
@PreDestroy //在销毁之前调用.destory-method
public void destory(){
System.out.println("我是销毁方法!");
}
...
}
相当于
<bean
name="user"
class="cn.itcast.bean.User"
init-method="init"
destroy-method="destory" >
</bean>
@configuration和@bean
bean类:注意是没有添加@Component注解的
//@Component
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
BeanConfig类:在这里把User通过Configuration和Bean的组合使用加到spring里面去,就相当于直接在User类上面加@Component注解
@Configuration
public class BeanConfig {
@Bean("user")
public User getUser(){
return new User();
}
}
调用:
@Autowired
@Qualifier("user")
private User user;
@org.junit.Test
public void demo(){
user.setName("yyy");
System.out.println(user.getName());
}
@Named @Inject
@Named==@Component
@Inject==@Resource
Spring整合Junit
作用就是用注解的方式简化下面的代码,不是必须的,可以不管
@Test
public void fun1() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User) applicationContext.getBean("user");
User user2 = (User) applicationContext.getBean("user");
System.out.println(user1);
applicationContext.close();
}
导包
spring-test-4.2.4.RELEASE.jar
代码
//-----------------------------------------
//帮我们创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件,大概相当于ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
@ContextConfiguration("classpath:applicationContext.xml")
//------------------------------------------
public class Demo {
//---------------------------------
//将名为user的对象注入到u变量中,大概相当于User u = (User) applicationContext.getBean("user");
@Resource(name = "user")
//---------------------------------
private User u;
@Test
public void fun2() {
//直接可以使用了,简化了获取user对象的代码
System.out.println(u);
}
}