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

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

总结

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

以上是 Java 中的控制反转(IOC)详解 的全部内容, 来源链接: utcz.com/p/249705.html

回到顶部