Spring的依赖注入和控制反转(二)实现

Spring的依赖注入和控制反转——Spring实现

Spring实现依赖注入有两种方法

  1. 基于配置文件实现
  2. 基于注解实现

对于基于配置文件方法,步骤为:

  1. 导包

  2. 在项目右键-》new-》Spring Bean Configuration File

    生成Spring配置文件

  3. 编写配置文件。

    在配置文件中注册组件(bean),添加组建依赖

对于基于注解方法,步骤为:

  1. 导包

  2. 在项目右键-》new-》Spring Bean Configuration File

    生成Spring配置文件

  3. 编写配置文:配置注解扫描包

  4. 在需要的地方添加注解

接下来先介绍基于配置文件的方式:

基于配置文件

使用Spring的配置文件实现依赖注入有两种方法

  1. 使用set方法进行注入(常用)
  2. 使用构造器进行注入

首先介绍最基本的注入,对Spring的实现的依赖注入有个了解

基本注入

假设我想在测试方法中调用NewsDao 的save方法,我们不使用new方法实例化NewsDao,使用依赖注入的方法在测试方法中注入NewsDao

首先我们需要在Spring的配置文件中注册NewsDao

<bean id="newsDao" class="spring.dao.NewsDao">bean>

这里注册一个名字叫"newsDao",类型为"spring.dao.NewsDao"的组件,这个就相当于

NewsDao newsDao;

在测试方法中,我们通过Spring的配置文件获取上下文(ApplicationContext),根据上下文注入名为"newsDao"的实例

public static void main(String[] args) {

    ApplicationContext ac = new  ClassPathXmlApplicationContext("applicationContext.xml");
	//寻找配置文件中名为"newsDao"的bean,根据bean中的calss属性来注入实例
    NewsDao newsDao = (NewsDao) ac.getBean("newsDao");
    newsDao.save();
}

测试结果如下:

1561606772841

set注入

首先,使用set方法注入,要求被注入的类要有相应的set方法,还是采用上一节的例子进行说明:这里要在NewsService中注入NewsDao

首先在NewsService中添加newsDao属性的set方法

public class NewsService {
	
	private NewsDao newsDao;

	public void setNewsDao(NewsDao newsDao) {
		this.newsDao = newsDao;
	}

	public void save() {
		
		System.out.println("NewsService保存操作");
		newsDao.save();
		
	}

}

然后在Spring配置文件中注册newsService,并且告诉Spring,在newsService里还需要注入newsDao

	<bean id="newsDao" class="spring.dao.NewsDao">bean>
	
	<bean id="newsService" class="spring.service.NewsService">
		
		<property name="newsDao" ref="newsDao">property>
	bean>

property标签表示使用set方法注入,要将实例注入到newsDao的属性里,其中:

name表示要注入的属性名,ref中填写要注入的实例的id

测试方法如下:

只需要注入newService实例就可以了,不需要再注入newsDao,Spring会根据配置文件自动往newService中注入newsDao

public static void main(String[] args) {
	
	ApplicationContext ac = new  ClassPathXmlApplicationContext("applicationContext.xml");

	NewsService newsService = (NewsService) ac.getBean("newsService"); 
	newsService.save();

}

测试结果如下:

1561607309930

构造器注入

这个方法不常用,常用的其实是set注入

基于构造器注入要求被注入的类必须有相应的构造器

假设这里我们需要注入一个初始值为id=1,title="测试标题"news,配置文件如下:

<bean id="news" class="spring.pojo.News">
	<constructor-arg name="id" value="1">constructor-arg>
	<constructor-arg name="title" value="测试标题">constructor-arg>
bean>

其中constructor-arg表示使用构造器注入,注意到,这里用的是value而不是ref

这两的区别在于

  • value用于基本类型

  • ref用于对象类型

基于注解

打开注解扫描

在Spring配置文件中打开注解扫描,由于我的包都是spring开头,因此这里的包名为spring

1561616607973

 	
 	
 	
 	<context:component-scan base-package="spring">context:component-scan>

使用注解将类注册到Spring中

使用注解注册类

常用的注解包括

  • @Component 通用注解

    将一个类交给Spring管理时的通用注解,相当于

    <bean name="" class="">

    的注册

  • @Repository 数据持久层注解

  • @Service 业务层注解

  • @Controller 控制器注解

其中,@Component和后面三个本质上没有区别,区别在于后三者是更规范的写法

@Repository
public class NewsDao {
	public void save() {
		System.out.println("NewsDao保存操作");
	}
	
}

使用注解进行注入

  • @Autowired 自动注入(常用)

    先按照类型注入如果没有,再检查名称注入

  • @Resource Javax的支持注入

    先检查名称注入,在检查类型注入

  • @Qualifier(“名字”)要和@Autowired一起使用

    标识名称是Spring在容器中自动指定的,指定的名字是驼峰命名法

@Service
public class NewsService {
	
	@Autowired
    @Qualifier("newsDao")
	private NewsDao newsDao;

    //...忽略其他
}

你可能感兴趣的:(spring)