Java基础之Spring5的核心之一IOC容器

一、什么是IOC

1)控制反转,把创建对象和对象的调用过程交给Spring 管理。

2)使用IOC的目的,为了降低耦合度。

二、IOC的底层原理

XML解析、工厂模式、反射

三、IOC思想

基于IOC容器完成,IOC容器底层就是对象工厂。

四、Spring 提供IOC容器实现两种方式:(两个接口)

(1)BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员使用

特点:加载配置文件的时候不会创建对象,在获取(使用)对象才去创建。

(2)ApplicationContext:BeanFactory接口的子接口。提供开发人员使用

特点:在加载配置文件的时候就创建对象

五、IOC操作之Bean管理

1、什么是Bean管理:

Bean管理指的是两个操作:
Spring创建对象
Spring注入值:手动注入、自动装配

<!--创建对象、自动装配
    bean标签里面的autowire属性:
        属性值:byName:根据属性名字注入值,id的值必须与类里面的属性名称一样
              byType:根据属性的类型注入值。
-->
<bean id="employee" class="tianfei.Spring5.autowire.Employee" autowire="byType">
    <!--手动装配-->
    <!--<property name="dept" ref="dept"></property>-->
</bean>

2、IOC操作之Bean管理两种方式

1)基于XML配置文件方式:

首先创建一个User类:

public class User {

        private Integer id;
        private String name;

        public User() {
        }

        public User(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

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

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

        public void setAddress(String address) {
            this.address = address;
        }
    }

在XML配置文件中配置User对象:

<!--1、配置User对象
       id:为创建后的对象名,可自取
       class:为类的全路径
  -->
<bean id="user" class="tianfei.Spring5.User">
    <!--2、通过set方法注入属性
            通过property注入属性
                 name :类里面的属性
                 value :类里面属性对应的值
    -->
    <property name="id" value="1"></property>
    <property name="name" value="田飞"></property>

    <!--通过有参构造注入属性-->
    <constructor-arg name="id" value="2"></constructor-arg>
    <constructor-arg name="name" value="张三"></constructor-arg>

    <!--通过p名称空间注入属性
         使用前,需在xml标签属性中加入:xmlns:p="http://www.springframework.org/schema/p"
    -->
    <bean id="user" class="tianfei.Spring5.User" p:id="1" p:name="李四"></bean>
</bean>

测试类:

public class testDemo {
    @Test
    public void test() {
        //1、加载Spring5 的xml配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        //2、获取配置创建的对象
        User user = context.getBean("usera", User.class);

        System.out.println(user);
    }
}

补充:在XML配置文件中引入外部文件(以jdbc.properties)

<!--引入外部文件  jdbc.properties
        需在名称空间中加入:xmlns:context="http://www.springframework.org/schema/context"
    -->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
        <property name="driverClassName" value="${prop.driverClassName}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.username}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>

jdbc.properties配置文件内容如下:

prop.driverClassName=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userdb
prop.username=root
prop.password=tianfei

2)基于注解方式(以UserDao接口以及其实现类和UserService类为例)

public interface UserDao {
          public void add();
    }
        @Controller(value = "userDaoImpl")
    public class UserDaoImpl implements UserDao {

        @Override
        public void add() {
            System.out.println("userdao add.......");
        }

        public UserDaoImpl() {
        }
    }
//value属性可以省略,如果省略则默认创建的对象名为  类名首字母小写  对象
@Service(value = "userService")
public class UserService {
    //基于注解注入基本类型数据
    @Value(value = "abc")
    private String str;

    //基于注解注入对象类型值
//    @Autowired  //根据类型注入
//    @Qualifier(value = "userDaoImpl")  //根据名称注入 需要和 Autowired 一起使用
//    private UserDao userDao;

//    @Resource   //根据类型注入
    @Resource(name = "userDaoImpl")  //根据名称注入
    private UserDao userDao;

    public void add() {
        System.out.println("service add........");
        userDao.add();
    }

    public void test() {
        System.out.println("userDao = " + userDao);
        System.out.println(str);
    }
}

测试类:

public class test {
    @Test
    public void test1(){
        //测试使用注解创建对象
        //需要在mxl配置文件中配置:<context:component-scan base-package="tianfei.Spring5"></context:component-scan> ,来开启注解扫描组件
        //不需要添加set方法
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        UserService userService = context.getBean("userService", UserService.class);

        System.out.println(userService);
        userService.add();
        userService.test();
    }
    @Test
    public void test2(){
        //测试使用注解创建对象
        //不需要添加set方法
        //使用完全注解
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        UserService userService = context.getBean("userService", UserService.class);

        System.out.println(userService);
        userService.add();
        userService.test();
    }
}

使用完全注解时需要创建一个类作为配置类:

@Configuration      //作为配置类,代替xml配置文件,进行完全注解开发
@ComponentScan(value = {"tianfei.Spring5"})
public class SpringConfig {
}

3、IOC操作Bean管理(工厂Bean)

Spring有两种Bean:

1)普通Bean:在配置文件中定义bean类型就是返回值类型

2)工厂Bean:在配置文件中定义bean类型和返回值类型可以不一样

第一步:创建一个类,作为工厂bean,实现接口FactoryBean

第二步:实现接口中得方法,在实现的方法中定义返回的bean类型

 public class MyBean implements FactoryBean<User> {

    //用来改变返回对象(返回的对象可以和创建的对象不一样)
    @Override
    public User getObject() throws Exception {
        return new User(1,"张三");
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

创建 MyBean.xml文件添入:

<!--创建类的对象-->
<bean id="myBean" class="tianfei.Spring5.factorybean.MyBean"></bean>

测试类:

   public class test {

    @Test
    public void testMyBean() {
        //测试 FactoryBean 工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("MyBean.xml");

        Book book = context.getBean("myBean",Book.class);
        System.out.println(book);
    }
}

4、Bean的生命周期(加上后置处理器后共七步):

(1)通过无参构造器创建bean实例(无参构造)
(2)为 bean的属性注入值或引用其他bean(set方法)
(3)把 bean 实例传递给 bean 后置处理器方法 postProcessBeforeInitialization
(4)调用 bean的初始化方法(需要自行配置初始化方法)
(5)把 bean 实例传递给 bean 后置处理器方法 postProcessAfterInitialization
(6)获取 bean实例对象
(7)当容器关闭时,调用 bean的销毁方法(需要自行配置销毁方法)

到此这篇关于Java基础之Spring5的核心之一IOC容器的文章就介绍到这了,更多相关Java Spring5的核心IOC容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring5.2.x 源码本地环境搭建的方法步骤

    1 克隆Spring源码 github 下载可能较慢,可以先 fork 官方仓库到自己的账户下,再从 gitee 导入. 使用 sourceTree 拉取代码到本地. 切换到5.2.x版本 git checkout origin/5.2.x 添加阿里云镜像 将下面这行代码粘贴到build.gradle文件中的repositories节点下即可 , maven { url "http://maven.aliyun.com/nexus/content/groups/public" } 预先

  • idea2020导入spring5.1的源码的详细教程

    1.先来说下导入环境和工具:     java版本:1.8     idea: idea2020     gradle:gradle5.3 2.gradle的安装     idea导入spring的源码时,每次构建的时候都会去下载gradle,所以如果我们能提前下好gradle可以提高构建速度.     gradle下载地址:https://services.gradle.org/distributions/     上面放的地址可以找到gradle的所有版本.(注意:构建spring源码是有版

  • 浅谈Spring5 响应式编程

    近年来,响应式编程在开发者社区和客户中很受欢迎,由于其以声明的方式构建应用程序的能力,而不是强制,形成更加敏感和有弹性的应用.Spring 5 将反应系统纳入其核心框架的事实已经显示出向声明式编程的范式转变. 响应式编程管理数据生产者和消费者之间的异步数据流,它们需要以流畅的方式对数据进行响应.所以,响应式编程都是异步和事件驱动的流畅应用程序,需要少量的线程进行缩放. 响应式编程很难构建基于线程的架构,由于在基于共享可变状态.线程和锁的应用程序扩展过程中涉及到高度复杂性. 在响应式编程的上下文中

  • spring5 webclient使用指南详解

    之前写了一篇restTemplate使用实例,由于spring 5全面引入reactive,同时也有了restTemplate的reactive版webclient,本文就来对应展示下webclient的基本使用. 请求携带header 携带cookie @Test public void testWithCookie(){ Mono<String> resp = WebClient.create() .method(HttpMethod.GET) .uri("http://baid

  • spring5 SAXParseException:cvc-elt.1: 找不到元素“beans 的声明详解

    解决方法 之前SSM项目一直报错,就是找不到错误 气啊 后来在网上找到了答案:原来spring5之后就不再需要写版本号了 总结 到此这篇关于spring5 SAXParseException:cvc-elt.1: 找不到元素"beans 声明的文章就介绍到这了,更多相关spring5 SAXParseException:cvc-elt.1: 找不到元素beans声明内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • Spring5+SpringMvc+Hibernate5整合的实现

    在进行环境搭建的时候我发现国内的Spring+SpringMvc+Hibernate整合资料比较少,即使有的话要么就是将所有配置放在一个配置文件,不易于理解结构,要么就是版本太旧,因此这篇文章简单讲解了如何配置相关的开发环境,使用的版本为jdk1.8+spring5+hibernate5 1 分层整合 我们都知道在Spring可以通过<import>标签来将不同的配置文件进行整合的,因此我们就用这个思路来进行整合,我们将全部的配置文件分为dao层,service层和view层,这样整合起来比较

  • Spring5中的WebClient使用方法详解

    前言 Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient.WebClient是Spring5中引入的执行 HTTP 请求的非阻塞.反应式客户端.它对同步和异步以及流方案都有很好的支持,WebClient发布后,RestTemplate将在将来版本中弃用,并且不会向前添加主要新功能. WebClient与RestTemplate比较 WebClient是一个功能完善的Http请求客户端,与RestTemplate相比,WebCl

  • Idea+maven搭建SSH(struts2+hibernate5+spring5)环境的方法步骤

    最近要使用 SSH 来编写期末的考核任务,之前也在网上查阅了很久,也试出了很多的问题.也很感谢很多前辈们的总结,我也查到了很多用用的内容. 本次项目,我将以一个简单的登录案例实现 SSH 的项目整合,项目我会放到 Github 上面,需要的同学可以 clone 下来在本地跑一跑 项目地址:SSH 脚手架 一.项目环境搭建 使用 maven 搭建一个 Java Web 项目 1.1 配置 Spring 坐标依赖 引入 Spring 坐标依赖 <!-- spring-context --> <

  • IDEA2020.1构建Spring5.2.x源码的方法

    内容概览 使用IDEA2020.1构建Spring5.2.x源码 环境 源码:spring5.2.xjdk11.08idea2020.1 spring spring5.2.x源码下载地址 gradle 下载 查看spring使用的gradle版本,这里要记得将distributionUrl指向本地的gradle包,不然还是会去下载的. distributionUrl=file:///H:/download/gradle-5.6.4-bin.zip gradle下载地址 安装 window下,配置

  • 使用idea和gradle编译spring5源码的方法步骤

    写在前面:spring 应该对于每个从事java开发的大兄弟们来说应该都不陌生的,作为一个从业两年多的小开发仔,个人觉得,每天都在面对spring,确从来没有编译过spring源码,有点不太合适.最近在研究spring源码的时候,突然想起编译一下spring源码,网上应该也有很多大神编译过spring源码,在这里我把我再编译过程的遇到的坑,来跟大家分享下. 版本工具:spring5.0.x,gradle4,9,jdk1.8_131,kotlin1.2.51,groovy2.4.15,Intell

  • spring5新特性全面介绍

    前方:对于很多开发人员来说,目前大都还在使用spring4的时候,而spring5早已经发布.虽然你可能暂时还没有使用到spring5,但还是需要对其有个大概的了解. Spring 5 于 2017 年 9 月发布了通用版本 (GA),它标志着自 2013 年 12 月以来第一个主要 Spring Framework 版本.它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式宣言中陈述的反应式原则为基础. 这个版本是很长时间以来最令人兴奋的 Spring Framework 版本

  • Spring5源码解析之Spring中的异步和计划任务

    Java提供了许多创建线程池的方式,并得到一个Future实例来作为任务结果.对于Spring同样小菜一碟,通过其scheduling包就可以做到将任务线程中后台执行. 在本文的第一部分中,我们将讨论下Spring中执行计划任务的一些基础知识.之后,我们将解释这些类是如何一起协作来启动并执行计划任务的.下一部分将介绍计划和异步任务的配置.最后,我们来写个Demo,看看如何通过单元测试来编排计划任务. 什么是Spring中的异步任务? 在我们正式的进入话题之前,对于Spring,我们需要理解下它实

随机推荐