Java Spring IOC 使用new、构造器、set、xml三种方式推导实现_oracle

DAO接口

package com.IOC.dao;

public interface IUserDao {
void get();
}

两个DAO接口实现类

package com.IOC.dao;

public class UserDaoMysqlImpl implements IUserDao {

@Override
public void get() {
System.out.println("Mysql 获取User");
}
}
package com.IOC.dao;

public class UserDaoOracleImpl implements IUserDao {

@Override
public void get() {
System.out.println("Oracle 获取User");
}
}

service接口

package com.IOC.service;

public interface IUserService {
void get();
}

第1种写法

*** 普通的三层切换多个dao,只能去修改service中的new对象 【耦合性太高】**

package com.IOC.service;

import com.IOC.dao.IUserDao;
import com.IOC.dao.UserDaoMysqlImpl;
import com.IOC.dao.UserDaoOracleImpl;

public class UserServiceImpl implements IUserService {
//new mysql底层
private IUserDao userDaoMysql = new UserDaoMysqlImpl();
//new orcle底层
private IUserDao userDaoOracle = new UserDaoOracleImpl();

@Override
public void get() {
//调用mysql底层方法
userDaoMysql.get();
//调用orcle底层方法
userDaoOracle.get();
}
}

第2种写法

*** 利用set进行动态注入**

package com.IOC.service;

import com.IOC.dao.IUserDao;

public class UserServiceImplSet implements IUserService {
private IUserDao userDao;

public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}

@Override
public void get() {
userDao.get();
}
}

第3种写法

*** 使用构造器进行动态注入**

package com.IOC.service;

import com.IOC.dao.IUserDao;

public class UserServiceImplContructor implements IUserService {
/**
* 第三种写法
* 使用构造器进行动态注入
*/
private IUserDao iUserDao;

public UserServiceImplContructor(IUserDao iUserDao) {
this.iUserDao = iUserDao;
}

@Override
public void get() {
iUserDao.get();
}
}

第4种写法xml配置

*** 利用set和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">

<bean id="UserDaoMysqlImpl" class="com.IOC.dao.UserDaoMysqlImpl"/>
<bean id="UserDaoOracleImpl" class="com.IOC.dao.UserDaoOracleImpl"/>

<bean id="UserServiceImplSet" class="com.IOC.service.UserServiceImplSet">
<!--ref:引用spring容器中创建好的对象-->
<property name="userDao" ref="UserDaoMysqlImpl"></property>
</bean>
</beans>

4种方法测试类

package com.IOC;

import com.IOC.dao.UserDaoMysqlImpl;
import com.IOC.dao.UserDaoOracleImpl;
import com.IOC.service.IUserService;
import com.IOC.service.UserServiceImpl;
import com.IOC.service.UserServiceImplContructor;
import com.IOC.service.UserServiceImplSet;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIOC {
/**
* 第1种做法
* 普通的三层切换多个dao,只能去修改service中的new对象 【不合理】
*/
@Test
public void test() {
IUserService userService = new UserServiceImpl();
userService.get();
}

/**
* 第2种写法
* 使用set进行动态注入
*/
@Test
public void test2() {
IUserService userService = new UserServiceImplSet();
//Mysql方法注入
((UserServiceImplSet) userService).setUserDao(new UserDaoMysqlImpl());
userService.get();
//Oracle方法注入
((UserServiceImplSet) userService).setUserDao(new UserDaoOracleImpl());
userService.get();

//另一种写法,耦合性比较高,实现类变了,要改比较多地方
UserServiceImplSet userServiceImplSet = new UserServiceImplSet();
//Mysql方法注入
userServiceImplSet.setUserDao(new UserDaoMysqlImpl());
userServiceImplSet.get();
//Oracle方法注入
userServiceImplSet.setUserDao(new UserDaoOracleImpl());
userServiceImplSet.get();
}

/**
* 第3种写法
* 使用构造器进行动态注入
*/
@Test
public void test3() {
//Mysql方法注入
IUserService userServiceMysql = new UserServiceImplContructor(new UserDaoMysqlImpl());
((UserServiceImplContructor) userServiceMysql).get();
//Oracle方法注入
IUserService userServiceOracle = new UserServiceImplContructor(new UserDaoOracleImpl());
((UserServiceImplContructor) userServiceOracle).get();
}

/**
* 第4种写法
* 使用XML配置(只能通过set实现注入,不能通过构造器)
*/
@Test
public void test4() {
//获取spring上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("IOC.xml");
//对象都在spring上下文对象里,要用时直接取
UserServiceImplSet bean = context.getBean(UserServiceImplSet.class);
bean.get();
}
}