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



