博客
关于我
第1章 Spring基础:3、Spring IoC
阅读量:233 次
发布时间:2019-02-28

本文共 6909 字,大约阅读时间需要 23 分钟。

学习目标:

Spring IoC


学习大纲:

1、 Spring IoC的基本概念

2、Spring的常用注解
3、 基于注解的依赖注入
4、 Java配置


学习内容:

1、 Spring IoC的基本概念

IOC(Inversion of Control)
其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源;而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件需要做的仅是选择一种合适的方式(属性注入[set函数]、构造器注入…)来接受资源,这种行为成为查找的被动形式。

当Spring框架出现后,对象的实例不再由调用者来创建,而是由Spring容器(比如面包店)来创建。Spring容器会负责控制程序之间的关系(比如面包店负责控制您与面包的关系),而不是由调用者的程序代码直接控制。这样,控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。

从Spring容器角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入,主要目的是为了解耦,体现一种“组合”的理念。
综上所述,控制反转是一种通过描述(在Spring中可以是XML或注解)并通过第三方去产生或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。

2、Spring的常用注解

2.1、声明Bean的注解
(1)@Component
该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上,没有明确的角色。
(2)@Repository
该注解用于将数据访问层 DAO的类标识为Bean,即注解数据访问层Bean,其功能与@Component()相同。
(3)@Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component()相同。
(4)@Controller
该注解用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component()相同。
2.2、注入Bean的注解
(1)@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除setter 和getter方法。默认按照Bean的类型进行装配。
(2)@Resource
该注解与@Autowired功能一样。区别在于,该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要结合@Qualifier注解一起使用。
@Resource注解有两个属性:name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
(3)@Qualifier
该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入,则需要结合该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。

3、 基于注解的依赖注入

Spring IoC容器(ApplicationContext)负责创建和注入Bean。Spring提供使用XML配置、注解、Java配置以及groovy配置实现Bean的创建和注入。本书尽量使用注解(@Component、@Repository、@Service以及@Controller等业务Bean的配置)和Java配置(全局配置如数据库、MVC等相关配置)完全代替XML配置,这也是Spring Boot推荐的配置方式。


下面通过一个简单实例【例1-2】向读者演示基于注解的依赖注入的使用过程,【例1-2】具体步骤如下。

1.使用Eclipse创建Web应用并导入JAR包
在这里插入图片描述
2.创建DAO层
在ch1_2应用的src中,创建annotation.dao包,该包下创建TestDao接口和TestDaoImpl实现类,并将实现类TestDaoImpl使用@Repository注解标注为数据访问层。
在这里插入图片描述

TestDao的代码如下:
package annotation.dao;public interface TestDao {   	public void save();}

TestDaoImpl的代码如下:

package annotation.dao;import org.springframework.stereotype.Repository;@Repository("testDao")/**相当于@Repository,但如果在service层使用@Resource(name="testDao")注入Bean,testDao不能省略。**/public class TestDaoImpl implements TestDao{   	@Override	public void save() {   		System.out.println("testDao save");	}}

3.创建Service层

在ch1_2应用的src中,创建annotation.service包,该包下创建TestService接口和TestSeviceImpl实现类,并将实现类TestSeviceImpl使用@Service注解标注为业务逻辑层。在这里插入图片描述

TestService的代码如下:

package annotation.service;public interface TestService {   	public void save();}

TestSeviceImpl的代码如下:

package annotation.service;import javax.annotation.Resource;import org.springframework.stereotype.Service;import annotation.dao.TestDao;@Service("testService")//相当于@Servicepublic class TestSeviceImpl implements TestService{   	@Resource(name="testDao")	/**相当于@Autowired,@Autowired默认按照Bean类型注入Bean**/	private TestDao testDao;	@Override	public void save() {   		testDao.save();		System.out.println("testService save");	}}

4.创建Controller层

在ch1_2应用的src中,创建annotation.controller包,该包下创建TestController类,并将TestController类使用@Controller注解标注为控制器层。
在这里插入图片描述
TestController的代码如下:

package annotation.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import annotation.service.TestService;@Controllerpublic class TestController {   	@Autowired	private TestService testService;	public void save() {   		testService.save();		System.out.println("testController save");	}}

5.创建配置类:

本书尽量不使用Spring的XML配置文件,而使用注解和Java配置。因此,在此需要使用@Configuration创建一个Java配置类(相当于一个Spring的XML配置文件),并通过@ComponentScan扫描使用注解的包(相当于在Spring的XML配置文件中使用<context:component-scan base-package=“Bean所在的包路径”/>语句)。
在ch1_2应用的src中,创建annotation包,该包下创建ConfigAnnotation的配置类
在这里插入图片描述
ConfigAnnotation的代码如下:

package annotation;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration//声明当前类是一个配置类(见1.3.4节),相当于一个Spring的XML配置文件。@ComponentScan("annotation")//自动扫描annotation包下使用的注解,并注册为Bean。//相当于在Spring的XML配置文件使用
语句功能一样。public class ConfigAnnotation { }

6.创建测试类

在ch1_2应用的src中,创建annotation包,该包下创建TestAnnotation的配置类
TestAnnotation的代码如下:

package annotation;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import annotation.controller.TestController;public class TestAnnotation {   	public static void main(String[] args) {   		//初始化Spring容器ApplicationContext		AnnotationConfigApplicationContext appCon = 				new AnnotationConfigApplicationContext(ConfigAnnotation.class);		TestController tc = appCon.getBean(TestController.class);		tc.save();		appCon.close();	}}}

7.运行结果

执行测试类的TestAnnotation的main方法在这里插入图片描述


4、 Java配置

Java配置是Spring4.x推荐的配置方式,它是通过@Configuration和@Bean来实现的。@Configuration声明当前类是一个配置类,相当于一个Spring配置的XML文件。@Bean注解在方法上,声明当前方法的返回值为一个Bean。下面通过实例【例1-3】演示Java配置的使用过程,具体步骤如下。
1.使用Eclipse创建Web应用并导入JAR包

在这里插入图片描述

2.创建DAO层
在ch1_3应用的src中,创建dao包,该包下创建TestDao类,此类中没有使用@Repository注解为数据访问层,具体代码如下:
在这里插入图片描述

TestDao的代码如下:

package dao;//此处没有使用@Repository声明Beanpublic class TestDao {   	public void save() {   		System.out.println("TestDao save");	}}

3.创建Service层

在ch1_3应用的src中,创建service包,该包下创建TestService类,此类中没有使用@Service注解为业务逻辑层,具体代码如下:
在这里插入图片描述

TestService的代码如下:

package service;import dao.TestDao;//此处没有使用@Service声明Beanpublic class TestService {   	//此处没有使用@Autowired注入testDao	TestDao testDao;	public void setTestDao(TestDao testDao) {   		this.testDao = testDao;	}	public void save() {   		testDao.save();	}}

4.创建Controller层

在ch1_3应用的src中,创建controller包,该包下创建TestController类。此类中没有使用@Controller注解为控制器层,具体代码如下:
在这里插入图片描述
TestController的代码如下:

package controller;import service.TestService;//此处没有使用@Controller声明Beanpublic class TestController {   	//此处没有使用@Autowired注入testService	TestService testService;	public void setTestService(TestService testService) {   		this.testService = testService;	}	public void save() {   		testService.save();	}}

5.创建配置类:

在ch1_3应用的src中,创建javaConfig包,该包下创建JavaConfig配置类。此类中使用@Configuration注解该类为一个配置类,相当于一个Spring配置的XML文件。在配置类中使用@Bean注解定义0个或多个Bean,具体代码如下:
在这里插入图片描述
ConfigAnnotation的代码如下:

@Configuration//一个配置类,相当于一个Spring配置的XML文件;//此处没有使用包扫描,是因为所有Bean都在此类中定义了。public class JavaConfig {   	@Bean	public TestDao getTestDao() {   		return new TestDao();	}	@Bean	public TestService getTestService() {   		TestService ts = new TestService();		//使用set方法注入testDao		ts.setTestDao(getTestDao());		return ts;	}	@Bean	public TestController getTestController() 		TestController tc = new TestController();		//使用set方法注入testService		tc.setTestService(getTestService());		return tc;	}}

6.创建测试类

在ch1_3应用的javaConfig中,创建TestConfig包,代码如下:

package javaConfig;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import controller.TestController;public class TestConfig {   	public static void main(String[] args) {   		//初始化Spring容器ApplicationContext		AnnotationConfigApplicationContext appCon = 			new AnnotationConfigApplicationContext(JavaConfig.class);		TestController tc = appCon.getBean(TestController.class);		tc.save();		appCon.close();	}}

7.运行结果

执行测试类的TestAnnotation的main方法

在这里插入图片描述


学习时间:

在这里插入图片描述

学习产出:

1、CSDN 技术博客累计 3 篇

转载地址:http://sjrp.baihongyu.com/

你可能感兴趣的文章
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>