Spring——(四)注解方式 IOC/DI

2018-10-29 01:45:00     

一、摘要

  1. 前面讲解IOC DI都是通过xml文件进行配置的,这种配置对小型项目是看不出什么问题,但是在大型项目上,就会觉得配置xml文件臃肿又麻烦了。因此,不再推荐使用xml的方式去装配Bean而是考虑使用注解的方式去装配Bean
  2. 两种注解配置:
  • 自动装配:对注入对象行为的注解
  • 组件扫描:对Bean的注解

二、自动装配

  • 导入上一篇博客Spring——(二)IOC控制反转/DI依赖注入的源代码作为这篇博客的继续
  • 修改xml配置文件,在xml配置文件中加上<context:annotation-config/>并且注释掉DI对象注入,如下配置:
  • Student实体类中的private Teacher teacher;前加上@Autowired注解,代码如下:
package entity;

import org.springframework.beans.factory.annotation.Autowired;

public class Student {
	private int id;
	private String name;
	@Autowired
	private Teacher teacher;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

}
  • 使用JUnit运行,打印结果不变
  • 如果有多个Teacher实例,这时候@Autowired就不知所措了,因为在BeanFactory获取getBean方法的时候是获取到多个Bean,Spring IOC容器不知道究竟该引入哪一个 Bean。如下配置:
<!-- 用于激活那些已经在spring容器里注册过的bean -->   
<context:annotation-config /> 
<bean name="teacher" class="entity.Teacher">   
	<property name="age" value="63"></property>  
 	<property name="name" value="Cubi"></property>   
</bean> 
<bean name="student" class="entity.Student">   
	<property name="id" value="18"></property>  
 	<property name="name" value="Bounds"></property>   	
	<!-- <property name="teacher" ref="teacher"></property> -->   
</bean>  
  • @Autowired下方加上@Qualifier("teacher1")即可获准确定位到name="teacher1"的Bean,代码如下:  
@Autowired   
@Qualifier("teacher1")   
private Teacher teacher; 

  • 除了@Autowired之外@Resource也具有一样的功能。代码如下:
@Resource(name="teacher2")   
private Teacher teacher; 

四、组件扫描

  • 修改xml文件,删除所有bean配置,新增<context:component-scan base-package="entity"/>,如果扫描多个包,则上面的代码书写多行,改变 base-package 里面的内容即可!配置如下:      
<context:component-scan base-package="entity"/>  
  • Student测试类和Teacher测试类上加上@Component即表明此类是bean(@Service也能达到同样的效果)。并且通过@Value来对变量赋值,代码如下:
package entity;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//@Service("student")
@Component("student")
public class Student {
	@Value("18")
	private int id;
	@Value("Boounds")
	private String name;
	
	@Autowired 
	@Qualifier("teacher")
	private Teacher teacher;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

}
  • 使用JUnit运行,打印结果不变

五、Spring EL表达式

  • 修改Student测试类,如下代码:
package entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("student")
public class Student {
	@Value("#{2+16}")
	private int id;
	@Value("#{teacher.getName()}")
	private String name;

	@Value("#{teacher}")
	private Teacher teacher;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

}

六、总结

  • @Autowired注解默认按照类型进行匹配,如果类型匹配的结果又多个,则搭配@Qualifier按照名称进行匹配
  • @Component里边的值不写,则Spring默认该类名的小写。例:该类名为Spring,则@Component就是spring
  • 实际上Spring EL远比以上注入方式都要强大,更多功能可自行了解

ps:本篇博客源码下载链接:https://pan.baidu.com/s/18r27DmQuXG2cMAlTc0Fc3g 密码:dfo3
Spring——(三)生命周期

一、摘要Spring容器生命周期BeanFactory类ApplicationContext类二、Spring生命周期1.创建SpringTest02工程,在service包下新建HelloSpring类,如下代码: package service; public class HelloSpring { public HelloSpring() { System.out.println("构造方法。。。"); } // 定义初始化方法 public void init() { System.out.println("init..."); } public void hello() { System.out.println("hello..."); } // 定义销毁方法 public void destory() { System.out.println("destory..."); } } 2.配置application-config.xml文件,代码如下: <?xml version="1.0" encoding=

Spring——(五)AOP面向切面

一、概念AOP 即Aspect Oriented Program面向切面编程在面向切面编程的思想里面,把功能分为核心业务功能和周边功能 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务。所谓的周边功能,比如性能统计,日志,事务管理等等周边功能在AOP思想里,定义为切面(Aspect)在面向切面编程AOP的思想里面,核心业务功能和周边功能分别独立开发然后把切面功能和核心业务功能 编织在一起,这就叫AOP二、Aspect的前置、最终通知新建SpringTest03项目,在service包下新建一个核心业务Student类注明其主要功能。代码如下:package service; /** * @author bounds * 定义一个核心功能 */ public class Student { /** * 赛跑 */ public void run(String name){ System.out.println(name+"参加100米赛跑。。。"); } } 2.继续在service包下新建一个切面Aspect类定义其主要功能,代码如下:package service; /** * @author bounds

 发表评论