首先先创建一个maven文件,整体结构如图1-1
图1-1
创建Dao接口类(UserDao)
package com.kuang.dao;
//接口类
public interface UserDao {
void getUser();
}
创建接口实现类(UserDaoImpl)
package com.kuang.dao;
//接口实现类
public class UserDaoImpl implements UserDao {
public void getUser(){
System.out.println("默认获取用户数据");
}
}
创建业务层service
创建业务层接口(UserService)
package com.kuang.service;
//业务层
public interface UserService {
}
创建业务层实现类(UserServiceImpl)
业务层调用Dao接口或其他接口 只需要更改“UserOracleImpl”为其他接口名即可
但是有一个弊端:如果用户频繁调用接口,就需要程序员频繁更改源码(IOC理论原理)
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.dao.UserOracleImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserOracleImpl();//业务层调用dao层
public void getUser(){
userDao.getUser();
}
}
创建Test测试类MyTest
import com.kuang.service.UserServiceImpl;
public class MyTest {
public static void main(String args[]){
//用户实际调用的是业务层,Dao层不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
注意:在UserServiceImpl中这里调用接口是锁死的,要想改变频繁修改源码的问题,可以使用set动态注入
private UserDao userDao = new UserOracleImpl();//业务层调用dao层
用set修改后的UserServiceImpl业务层实现类是这样的
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.dao.UserOracleImpl;
import org.omg.CORBA.PUBLIC_MEMBER;
public class UserServiceImpl implements UserService{
private UserDao userDao;//业务层调用dao层,之前是写死的
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser(){
userDao.getUser();
}
}
测试类直接调用即可,代码如下
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserServiceImpl;
public class MyTest {
public static void main(String args[]){
//用户实际调用的是业务层,Dao层不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
是需要在这段语句中调用要使用的接口即可,不需要再修改源码
userService.setUserDao(new UserDaoMysqlImpl());
具体实现: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">
<bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpl"/>
<!--相当于new-->
<bean id="oracleImpl" class="com.kuang.dao.UserOracleImpl"/>
<bean id="UserServiceImpl" class="com.kuang.service.UserServiceImpl">
<!--
userdao通过set方法进行注入
ref:引入spring容器中创建好的对象
value:具体的值,基本数据类型
-->
<property name="userDao" ref="oracleImpl">
</property>
</bean>
</beans>
写测试类,不再用之前的new而是直接获取ApplicationContext
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String args[]){
//用户实际调用的是业务层,Dao层不需要接触
/*
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
*/
//获取ApplicationContext 拿到Spring的容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//需要什么就get什么
UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");//由context.getBean("")→类型是UserServiceImpl→强转后得到
userServiceImpl.getUser();
}
}
用户只需要修改beans.xml配置文件即可(准确来说是里面的property) property含义可以参考
https://blog.csdn.net/bingguang1993/article/details/87690413
<property name="userDao" ref="oracleImpl">