Java 中的控制反转(IOC)详解

目录
  • IOC理论推导
  • Spring管理对象
  • Spring管理对象的简单例子
  • Bean无参构造类创建和有参构造类创建
  • Spring的一些配置
    • 别名
    • Bean的配置
    • import
  • 总结

IOC理论推导

Dao层

1.UserDao 接口

2.UserDaoImpl 实现类

Service层

3.UserService 业务接口

4.UserServiceImpl 业务实现类

用户实际调用service层 不会动dao层!

Dao层接口创建

package com.ckm.dao;
public interface UserDao {
    void getUser();
}

Dao层实现类1创建

package com.ckm.dao;
public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取了User数据");
    }
}

Dao层实现类2创建

package com.ckm.dao;
public class UserDaoMysqlImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("mysql使用了数据");
    }
}

Service层接口创建

package com.ckm.service;
public interface UserService {
    void getUser();
}

Service层接口实现类创建

package com.ckm.service;
import com.ckm.dao.UserDao;
import com.ckm.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
//    private UserDao userDao = new UserDaoImpl();
    //利用set进行动态实现值的注入
    private UserDao userDao;
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

单元测试

import com.ckm.dao.UserDaoImpl;
import com.ckm.dao.UserDaoMysqlImpl;
import com.ckm.service.UserServiceImpl;
public class TestIOC {
    public static void main(String[] args) {
        //用户实际调用service层 不会动dao层!
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoMysqlImpl());
        userService.getUser();
    }
}

Spring管理对象

resources中新建beans.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--使用Spring来创建对象,在Spring这些都称为Bean-->
    <!--bean = 对象-->
    <!--id = 变量名-->
    <!--class = new的对象-->
    <!--property 相当于给对象中的属性设值-->
    <bean id="DaoImpl" class="com.ckm.dao.UserDaoImpl" />
    <bean id="MysqlImpl" class="com.ckm.dao.UserDaoMysqlImpl" />
    <bean id="UserServiceImpl" class="com.ckm.service.UserServiceImpl">
        <!--
        value具体的值,基本数据类型
        ref是引用Spring中创建好的对象
        用户需要什么 就直接修改ref就ok
        -->
        <property name="userDao" ref="MysqlImpl" />
    </bean>
</beans>

dao层、Service层代码不变

测试类

import com.ckm.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");
        userServiceImpl.getUser();
    }
}

Spring管理对象的简单例子

User类

package com.ckm.pojo;
public class Hello {
    private String str;
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

beans.xml

package com.ckm.pojo;
public class Hello {
    private String str;
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

测试类

import com.ckm.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
    public static void main(String[] args) {
        //获取spring的上下文对象
        //xml加载必须new ClassPathXmlApplicationContext()
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //我们的对象现在都在spring中管理,我们要使用,直接去里面取出来
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.getStr());
    }
}

Bean无参构造类创建和有参构造类创建

当getBean的时候,这个类就已经被实例化了,就会执行无参构造方法

有参构造的User类

package com.ckm.pojo;
public class User {
    private String name;
//    public User() {
//        System.out.println("无参构造");
//    }
    public User(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

编写Beans.xml

    <!--第一种 下标赋值-->
    <bean id="user" class="com.ckm.pojo.User">
        <constructor-arg index="0" value="这个是第一种有参设置的name"/>
    </bean>
    <!--第二种 直接通过参数名-->
    <bean id="user" class="com.ckm.pojo.User">
        <constructor-arg name="name" value="这个是第二种方法是有参设置的name"/>
    </bean>

Spring的一些配置

别名

    <!--alias是别名,我们可以使用这个别名来获取这个对象-->
    <alias name="user" alias="userNew"/>

Bean的配置

    <!--在bean中name也是别名,可以同时取多个别名-->
    <bean id="user" class="com.ckm.pojo.User" name="user1,user2,user3,user4"/>

import

   <!--这个import,一般用于团队开发,他可以将多个配置文件导入合并成一个-->
    <import resource="beans1.xml"/>
    <import resource="beans2.xml"/>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更对内容!

(0)

相关推荐

  • Java spring webmvc如何实现控制反转

    概述 本文基于示例的方式解释控制反转,再看控制反转之前,我们先看下常规控制流程,以数据库访问为例 示例并没有实际访问数据,而是基于service和dao,模拟请求数据 创建项目 注意:本实例基于Idea开发工具 打开创建项目选项(New Project),选择Maven,不要选择"Create from crchetype",点击Next GroupID:com.example和ArtifactID:Demo,点击Next和Finish 新生成的项目目录结构如下: src main j

  • Java Spring 控制反转(IOC)容器详解

    目录 什么是容器? 无侵入容器 IOC控制反转 IOC理论推导 传统应用程序开发的弊端 "注入"机制 小结 IOC本质 DI(依赖注入) 总结 IoC 容器是 Spring 的核心,也可以称为 Spring 容器.Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期. Spring 中使用的对象都由 IoC 容器管理,不需要我们手动使用 new 运算符创建对象.由 IoC 容器管理的对象称为 Spring Bean,Spring Bean 就是

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    近来总是接触到 IoC(Inversion of Control,控制反转).DI(Dependency Injection,依赖注入)等编程原则或者模式,而这些是著名 Java 框架 Spring.Struts 等的核心所在.针对此查了 Wikipedia 中各个条目,并从图书馆借来相关书籍,阅读后有些理解,现结合书中的讲解以及自己的加工整理如下: eg1 问题描述: 开发一个能够按照不同要求生成Excel或 PDF 格式的报表的系统,例如日报表.月报表等等.   解决方案: 根据"面向接口编

  • Java 中的控制反转(IOC)详解

    目录 IOC理论推导 Spring管理对象 Spring管理对象的简单例子 Bean无参构造类创建和有参构造类创建 Spring的一些配置 别名 Bean的配置 import 总结 IOC理论推导 Dao层 1.UserDao 接口 2.UserDaoImpl 实现类 Service层 3.UserService 业务接口 4.UserServiceImpl 业务实现类 用户实际调用service层 不会动dao层! Dao层接口创建 package com.ckm.dao; public in

  • PHP依赖注入(DI)和控制反转(IoC)详解

    首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描述,充斥着大量的生涩词汇,要么就是java代码描述的,也生涩. 不管怎么样,总算弄清楚一些了,下面就以php的角度来描述一下依赖注入这个概念. 先假设我们这里有一个类,类里面需要用到数据

  • java 中createStatement()方法的实例详解

    java 中createStatement()方法的实例详解 用缺省设置创建时,ResultSet 是一种只能访问一次(one-time-through).只能向前访问(forward-only)和只读的对象.您只能访问数据一次,如果再次需要该 数据,必须重新查询数据库. 然而,并不只有这一种方式.通过设置 Statement 对象上的参数,您可以控制它产生的 ResultSet.例如: ... Class.forName(driverName); db = DriverManager.getC

  • Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解 CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantLock.ReadWriteLock锁实现同步. 3.信号量Semaphore实现同步. 其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题.信号量Semaphore解决的是多副本资源的共享访问问题. 今天

  • Java中JDBC的使用教程详解

    目录 概念 快速入门 步骤 代码实现 详解各个对象 DriverManager:驱动管理对象 Connection:数据库连接对象 Statement:执行sql的对象 ResultSet:结果集对象,封装查询结果 PreparedStatement:执行sql的对象 抽取JDBC工具类 : JDBCUtils 分析 代码实现 练习 JDBC控制事务 事务 操作 使用Connection对象来管理事务 代码 概念 Java DataBase Connectivity  Java 数据库连接, J

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • Java中正则表达式的使用和详解(下)

    在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示: 1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$  用户名(字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$ 手

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • java 中自定义OutputFormat的实例详解

    java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa

  • java中的interface接口实例详解

     java中的interface接口实例详解 接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在private成员 3.java接口中不能出现方法的具体实现. 4.实现某个接口就必须要实现里面定义的所有方法. 接下来看一个实现接口的案例: package hello;   interface competer{ //定义接口 void set_comp

随机推荐