Spring注解
Spring提供了一系列的注解,用于管理JavaBean
优点:
1.注解是Java语法,被Java编译器检查,可以减少配置错误。
2.注解提供了默认支持功能,默认情况下会自动完成注入功能。
3.注解和XML配置可以混合使用,自己写的类使用注解,其他人写的API使用XML配置。
利用Spring注解创建Bean
1.创建Java类,标注注解
@Component//默认的BeanID为"demoBean"
//@Component("myBean")//自定义BeanID,没什么意义,不常用
//通常受Spring管理的组件,默认作用域是"singleton",如果需要其他作用域,使用@Scope注解
@Scope("prototype")//多例模式
public class DemoBean implements Serializable{
@Override
public String toString() {
return "DemoBean";
}
}
2.在配置文件中,开始注解扫描功能
<!-- 配置Spring的注解扫描功能, 指定Spring扫描组件的范围:扫描bean包 -->
<context:component-scan base-package="bean"/>
3.测试案例
@Test
public void testDemoBean() {
DemoBean bean = ctx.getBean("demoBean",DemoBean.class);
System.out.println(bean);
}
下列注解的功能是一样的,建议按照组件层级来使用对应注解
@Component 通用组件
@Named 通用组件 来自javax.inject包,需要利用Maven导入
@Repository 持久层注解
@Service 业务层注解
@Controller 控制器
管理对象生命周期
@PostConstruct 构造器之后执行方法(一般为初始化操作)
@PreDestroy 在销毁之前执行方法(一般为文件关闭操作)
1.导入注解包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2.编写Java类
@Component
public class Writer implements Serializable{
private PrintWriter out;
@PostConstruct//在构造器以后执行 init方法
public void init() throws IOException {
out = new PrintWriter("demo.txt");
System.out.println("init()");
}
public void write(String str) {
out.println(str);
}
@PreDestroy//在销毁之前执行close()
public void close() {
out.close();
System.out.println("close()");
}
}
3.测试案例
@Test
public void testWriter() {
Writer write= ctx.getBean("writer",Writer.class);
write.write("HelloWorld");
}
注解注入
注解注入属性:
1.@Autoware和@Resource功能一样(@Resource(name="beanID")可以重新定义bean对象的ID);
2.注解采用默认规则自动注入,先按照名字自动注入,再按照类型自动注入;
3.注解可以标注在Bean属性和实例变量上。
注入的三种方式:
0.导入依赖包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
1.标注在属性上
Worker类
@Component
public class Worker {
@Autowired
private Tool tool;//属性名字为tool
public Tool getTool() {
return tool;
}
public void setTool(Tool tool) {
this.tool = tool;
}
}
Tool接口,实现类Axe(
a.先按照名字相同规则进行匹配,Component注解里的value值,即为Worker类中属性的名字。
b.名字相同无法匹配,按照类型相同进行匹配(兼容性,Axe父类类型为Tool,可以按照规则进行匹配)。
@Component("tool")
public class Axe implements Tool,Serializable {
@Override
public String toString() {
return "斧子";
}
}
测试案例
@Test
public void testInject() {
Worker worker = ctx.getBean("worker",Worker.class);
System.out.println(worker.getTool());
}
2.标注在set方法上
Worker类
@Component
public class Worker {
private Clothes clothes;
@Autowired
public void setClothes(Clothes clothes) {
this.clothes = clothes;
System.out.println("setClothes:" + clothes);
}
public Clothes getClothes() {
return clothes;
}
}
Clothes类
Component注解生成默认id clothes,对应标注的方法setClothes,先按照名字匹配,再按照类型匹配。
@Component
public class Clothes {
@Override
public String toString() {
return "工作服";
}
}
测试案例
@Test
public void testClothes() {
Worker worker = ctx.getBean("worker",Worker.class);
System.out.println(worker.getClothes());
}
3.混合使用XML配置文件及Spring注解注入实体类属性
Worker类
@Component
public class Worker {
@Autowired
private Gun gun;
public Gun getGun() {
return gun;
}
public Tool getTool() {
return tool;
}
}
Gun类
public class Gun {
@Override
public String toString() {
return "98K";
}
}
配置文件
<!-- 配置Spring的注解扫描功能, 指定Spring扫描组件的范围:扫描bean包 -->
<context:component-scan base-package="bean"/>
<!-- 配置注入的bean标签 (默认按名字gun进行注入)-->
<bean id="gun" class="bean.Gun" />
测试案例
@Test
public void testGun() {
Worker worker = ctx.getBean("worker",Worker.class);
System.out.println(worker.getGun());
}
Value注解的作用
@Value注解常与Spring表达式配合使用,如:
//将id为cfg的对象的name属性的值,注入到实体类的name属性中,并且会覆盖构造器的值
//properties文件中,不识别中文,输入中文会自动转为Unicode编码
@Value("#{cfg.name}")
private String name;