当前位置:首页 > 编程教程 > java技术文章 > 详谈Spring对IOC的理解(推荐篇)

Spring对IOC的知识点理解

  • 发布时间:
  • 作者:码农之家
  • 点击:80

这篇文章主要知识点是关于Spring、IOC、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

微服务实战(Dubbox+Spring Boot+Docker)
  • 类型:微服务大小:90.8 MB格式:PDF作者:肖睿
立即下载

详谈Spring对IOC的理解(推荐篇)

一、IOC控制反转和DI依赖注入

1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类通过new去主动创建并实例化的,对对像创建的主动权在程序代码中。程序不仅要管理业务逻辑也要管理对的象创建和依赖关系。这是很累的,也跟软件工程 "低耦合高内聚" 的概念不十分符合。

详谈Spring对IOC的理解(推荐篇)

有了spring的ioc容器之后,对象的实例化和依赖关系管理都由IOC容器进行统一管理,主体类只要依赖ioc容器就够了,需要啥,容器会给他注入进去,也就是只要声明对象不用再主动去new,ioc容器帮忙把相应的对象注入到声明对象中,使其变成实例化对象。(类似主体类提供一个躯体,ioc容器把灵魂注入进去,使其变成一个生命体,激活他),这样创建对象的主动权就转移交接了,

  详谈Spring对IOC的理解(推荐篇)

二、使用xml配置方式实现IOC

1.在ioc容器中配置了dao实现类和service类的bean,在容器加载的时候就会实例化这些bean到内存中。(bean.xml配置如下)

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  ">

  <!-- BookDao Bean -->
  <bean id="bookDao" class="com.study.DaoImpl.BookDaoImpl"></bean>

  <!-- BookService Bean-->
  <bean id="bookService" class="com.study.Service.BookService">
    <!-- BookService中的声明了BookDao对象,通过ref属性将BookDao的bean注入到对象中 -->
    <property name="bookDao" ref="bookDao"/>
  </bean>
</beans>

2. service类中需要用到dao类的实例(正常情况下需要new一个dao类对象),但是用ioc容器接管后只需要声明dao接口对象即可,然后写一个dao对象的set方法。(要注入的对象必须要有set方法,否则将报错 Bean property 'bookDao' is not writable or has an invalid setter method)因为spring注入是根据反射机制实现的,他在反射注入的时候会调用该方法名的set方法,如果set方法写错,或者根本没写,那么注入就会失败。(BookService类如下)

public class BookService {
 private BookDao bookDao;

 public BookService() {
  System.out.println("BookService实例化");
 }

 public void setBookDao(BookDao bookDao) {
  System.out.println("BookService属性初始化装配成功");
  this.bookDao = bookDao;
 }

 public void storeBook(String bookname){
  System.out.println("图书上架");
  System.out.println(bookDao.addBook(bookname));
 }
}

如上代码:BookSerivce类需要用到BookDao对象,但是却没有new对象,只有一个set方法,这个set方法就是ioc容器注入的入口(必不可少),

3.此处我们用ApplicationContext作为容器,初始化配置文件,然后从容器中根据id名取出容器中已经帮我们实例化好的对象。

public class TestDmeo {
 BookService bookService;

 @Test
 public void testStoreBook(){
  System.out.println("容器初始化");
  ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
  bookService = (BookService) app.getBean("bookService");//将对象注入到声明好的BookService对象中。(bookService就是配置文件中的id)
  bookService.storeBook("Spring MVC");
 }
}

 详谈Spring对IOC的理解(推荐篇)

4.dao类和实现类如下:

接口类:

public interface BookDao {
  public String addBook(String BookName);
 }

实现类:

public class BookDaoImpl implements BookDao {

 public BookDaoImpl() {
  System.out.println("BookDao实例化");
 }

 public String addBook(String BookName) {
  return BookName+"添加成功";
 }
}

5.运行测试结果:

详谈Spring对IOC的理解(推荐篇)

6.大体思路如下图:

详谈Spring对IOC的理解(推荐篇)

程序中除了初始化容器用了new对象,其余的基本没有new的存在。

二、注解方式配置IOC

注解配置方式目的和xml配置的目的一样,都是为了实现bean的创建。常用的注解如下:

@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。

@Repository 对Dao实现类进行注解 (特殊的@Component)

@Service 用于对业务逻辑层进行注解, (特殊的@Component)

@Controller 用于控制层注解 , (特殊的@Component)

装配注解如下:

@Autowired 默认按照类型装配注入,想按照名称来装配的话要结合@Quapfier(“name”)一起使用,使用@Autowired注解可以不用set方法。@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个

@Quapfier("name") 中的name是bean的名字,也就是id,和@Autowired可以作为限定专配对象的名称

@Resource 默认按照名称装配注入,当找不到对应名成的bean的时候就按照类型匹配,如果还是找不到的话就会报错,@Autowired是spring提供的,@Resource是javaee提供,使用@Resource可以减少对spring的依赖

范例:

1.例子同上,只是配置bean的方式从xml文件中转移到了代码中,用注解体现。

详谈Spring对IOC的理解(推荐篇)

2.除了把配置文件中<bean id="" class=""/>变成对应的注解外,另外一个区别在于,bean.xml文件中的修改,需要做如下,配置才能够使注解生效

详谈Spring对IOC的理解(推荐篇)

context的配置有如下方法:

1.仅扫描特定包下的特定类

<context:component-scan base-package="com.study" resource-pattern="Service/B*.class"/>

这是扫描Service包下B开头的所有类。

2.使用<context:include-filter .../>和<context:exclude-filter .../>配置那些需要和不需要的扫描的包

 

Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 符合SomeAnnoation的target class(注解类)
assignable org.example.SomeClass 指定class或interface的全名(指定确切的类或接口)
aspectj org.example..*Service+ AspectJ语法
regex org\.example\.Default.* Regelar Expression  (正则表达式)
custom org.example.MyTypeFilter Spring3新增自定义Type,org.springframework.core.type.TypeFilter

 

<!-- 容器扫描包下的注解配置组件 -->
  <context:component-scan base-package="com.study" use-default-filters="false">
    <context:include-filter type="aspectj" expression="com.study.Service.*"/> <!-- 模糊过滤 -->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/><!-- 过滤指定的注解 -->
    <context:include-filter type="assignable" expression="com.study.Service.BookService"/><!-- 过滤指定的类或接口,路径要完整,如果是接口的话,所有派生类都会被过滤 -->
    <context:include-filter type="regex" expression="com.*"/>
  </context:component-scan>

<context:exclude-filter ../>要配在<context:include-filter .../>的后面。

以上这篇详谈Spring对IOC的理解(推荐篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • spring boot集成rabbitmq的代码实例
  • 一、RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache). 消息中间件的工作过程可以用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息.具体过程如下: 从上图可看出,对于消息队列来说,生产者,消息队……

  • 使用Spring通过JPA连接到Db2示例代码
  • 前提条件 Maven 一个拥有访问凭证的 Db2 实例: IBM Cloud 本地 Java JDK IBM Cloud 开发者工具(可选) 创建项目 首先,确定您计划使用 IBM Cloud 开发者工具还是 Spring Initializr 创建项目,然后按照各自的说明进行操作。 IBM Cloud 开发者工具 如果您使用 IBM Cloud 开发者工具创建项目,那么使用 dev 插件创建新的 Spring 微服务。 ibmcloud dev create 1.选择 Backend Service / Web App。 2.选择 Java Spring。 3.选……

  • SpringCloud实现SSO单点登录的用法及实例
  • 前言 作为分布式项目,单点登录是必不可少的,文本基于之前的的博客(猛戳:SpringCloud系列Zuul 动态路由,SpringBoot系列Redis)记录Zuul配合Redis实现一个简单的sso单点登录实例 sso单点登录思路: 1、访问分布式系统的任意请求,被Zuul的Filter拦截过滤 2、在run方法里实现过滤规则:cookie有令牌accessToken且作为key存在于Redis,或者访问的是登录页面、登录请求则放行 3、否则,将重定向……

  • springMVC自定义注解 AOP来实现日志记录的方法
  • 需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中。 为了保证工期,在查阅了资料以后,决定用AOP+自定义注解的方式来完成这个需求。 准备工作 自定义注解需要依赖的jar包有 aspectjrt-XXX.jar ,aspectjweaver-XXX.jar,XXX代表版本号。 自定义注解 在项目下单独建立了一个……

  • 学习Spring boot项目redisTemplate实现轻量级消息队列
  • 背景 公司项目有个需求, 前端上传excel文件, 后端读取数据、处理数据、返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没人愿意傻等, 由于项目暂未使用ActiveMQ等消息队列中间件, 而redis的lpush和rpop很适合作为一种轻量级的消息队列实现, 所以用它完成此次功能开发 一、本文涉及知识点 excel文件读写--阿里……

    相关电子书
    学习笔记

    Copyright 2018-2020 xz577.com 码农之家

    本站所有电子书资源不再提供下载地址,只分享来路

    版权投诉 / 书籍推广 / 赞助:QQ:520161757