Spring学习笔记-03

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;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值