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

编辑: admin 分类: java 发布时间: 2021-12-03 来源:互联网
目录
  • 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"/>
    

    总结

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

    【文章出处:国外服务器 转发请说明出处】