?
?User类:
package com.itheima;
public class User {
private String name;
private String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
?UserService接口:
package com.itheima;
public interface UserService {
public void regist(User user);
public void login(String name,String password);
}
?UserServiceImpl实现类:
package com.itheima;
public class UserServiceImpl implements UserService {
//private UserDAO userDAO=new UserDAOImpl();//这里也会出现耦合,需要工厂类解耦合
//使用工厂类解耦合
private UserDAO userDAO=BeanFactory.getUserDAO();
@Override
public void regist(User user) {
userDAO.save(user);
}
@Override
public void login(String name, String password) {
userDAO.queryUserByNameAndPassword(name,password);
}
}
UserDAO接口:
package com.itheima;
public interface UserDAO {
public void save(User user);
public void queryUserByNameAndPassword(String name,String password);
}
UserDAOImpl实现类:
package com.itheima;
public class UserDAOImpl implements UserDAO {
public UserDAOImpl() {
super();
}
public void save(User user) {
System.out.println("intsert into user="+user);
}
public void queryUserByNameAndPassword(String name, String password) {
System.out.println("query User name ="+name+"password="+password);
}
}
UserServiceImplNew实现类:
package com.itheima;
public class UserServiceImplNew implements UserService {
@Override
public void regist(User user) {
System.out.println("intsert into user="+user);
}
@Override
public void login(String name, String password) {
System.out.println("query User name ="+name+"password="+password);
}
}
BeanFactory类:工厂类:
package com.itheima;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/*
工厂类中:new UserServiceImpl();也出现了耦合
对象的创建方式:
1.直接调用构造函数 创建对象 UserService userService=new UserServiceImpl()
2.通过反射方式创建对象 反射可以解耦合
Class clazz=Class.forName("com.itheima.UserServiceImpl");//获取类对象
UserService userService=clazz.newInstance();
*/
public class BeanFactory {
private static Properties env=new Properties();//创建Properties集合
//读取properties文件
//通过代码块来读取io避免重复性打开io,并且在程序启动的时候一次性读取想要的内容,可以通过静态代码块
static{
try {
//1.获取IO输入流
InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
//2.文件内容封装到Properties集合里面 问价当中的key作为将集合的key,文件中的值作为集合的值
env.load(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//解 SpringTest类的耦合
public static UserService getUserService(){
//return new UserServiceImpl();出现耦合
UserService userService=null;
try {
//为解决这个耦合可以把这个全限定名称写到一个配置文件properties里面
Class clazz=Class.forName(env.getProperty("userService"));//传入全限定名,以后可以换成新的类,也需要手动改变,这里页出现耦合
userService=(UserService) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return userService;
}
//解UserServiceImpl类 的耦合
public static UserDAO getUserDAO(){
UserDAO userDAO=null;
try {
//为解决这个耦合可以把这个全限定名称写到一个配置文件properties里面
Class clazz=Class.forName(env.getProperty("userDAO"));//传入全限定名,以后可以换成新的类,也需要手动改变,这里页出现耦合
userDAO=(UserDAO) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return userDAO;
}
}
applicationContext.properties配置文件:
#properties 通过key和values 组成
#properties 集合 存储Properties文件内容
#特殊的Map key=value
#通过:
# Properties.getProperty("userService");获取值
userService=com.itheima.UserServiceImpl
#后续如果需要跟换实现类只需要更改实现类的全限定名称
SpringTest测试类:
package com.itheima;
import org.junit.Test;
public class SpringTest {
/*
测试工厂类进行耦合操作:
有了耦合,可以通过工厂类设计模式:通过工厂类创建对象
*/
@Test
public void test1(){
//把这个接口的实现类编码到了程序当中,就出现偶合:比如以后要换一个实现类的时候,那么测试类也跟着改变
//要换一个实现类UserServiceImplNew 需要替换下面的代码为UserService userService=new UserServiceImplNew();
//经过修改后项目经过重新编译和部署,不符合面向对象设计开闭原则:打开扩展,关闭修改
// UserService userService=new UserServiceImpl();//这一行代码出现耦合
/*
通过工厂类: 解决耦合
*/
UserService userService=BeanFactory.getUserService();
userService.login("name","suns");
User user=new User("suns","123456");
userService.regist(user);
}
}
|