欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 10:08:12
目录ioc理论推导spring管理对象spring管理对象的简单例子bean无参构造类创建和有参构造类创建spring的一些配置bean的配置ioc理论推导dao层1.userdao 接口2.user...

ioc理论推导

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

Java 中的控制反转(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();
    }
}

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

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();
    }
}

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

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());
    }
}

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

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"/>

总结

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