一、传统方法创建实例对象
存在代码耦合的问题
User.java 【通用】
public class User {
private String name;
private String password;
public User() {
}
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 + '\'' +
'}';
}
}
UserDao.java 【通用】
public interface UserDao {
public void createUser(User user);
public void queryUserNP(String name,String Pass);
}
UserDaoImpl.java【通用】
public class UserDaoImpl implements UserDao {
@Override
public void createUser(User user) {
System.out.println("注册了一位用户:" + user);
}
@Override
public void queryUserNP(String name, String pass) {
System.out.println("用户名为:" + name + " " + "密码为:" + pass);
}
}
UserService.java 【通用】
public interface UserService {
public void register(User user);
public void Login(String name,String pass);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void register(User user) {
userDao.createUser(user);
}
@Override
public void Login(String name, String pass) {
userDao.queryUserNP(name,pass);
}
}
TestDemo_01.java
public class TestDemo_01 {
@Test
public void testDemo() {
UserService userService = new UserServiceImpl();
User user = new User("小明","123456");
userService.register(user);
userService.Login("小明","123456");
}
}
二、使用自定义工厂创建实例对象
解决代码耦合与代码冗余问题
BeanFactory.java
public class BeanFactory {
private static Properties properties = new Properties();
static {
try {
//获得输入流
InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
//封装Properties集合中
properties.load(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//简单工厂
/*public static UserService getUserService() {
UserService userService = null;
try { //com.demo_03.UserServiceImpl存在耦合
Class clazz = Class.forName(properties.getProperty("userService"));
userService = (UserService)clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return userService;
}
public static UserDao getUserDao() {
UserDao userDao = null;
try {
Class clazz = Class.forName(properties.getProperty("userDao"));
userDao = (UserDao)clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return userDao;
}*/
//通用工厂(简单工厂的精炼)
public static Object getBean(String key) {
Object ob = null;
try {
Class clazz = Class.forName(properties.getProperty(key)); // class com.deom_03.Xxx
ob = clazz.newInstance(); // 创建此 Class 对象所表示的类的一个新实例
} catch (Exception e) {
e.printStackTrace();
}
return ob;
}
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
//private UserDao userDao = new UserDaoImpl(); //耦合
//private UserDao userDao = BeanFactory.getUserDao(); //解耦合(简单工厂)
private UserDao userDao = (UserDao) BeanFactory.getBean("userDao"); //通用工厂
@Override
public void register(User user) {
userDao.createUser(user);
}
@Override
public void Login(String name, String pass) {
userDao.queryUserNP(name,pass);
}
}
properties文件
# Properties 集合存储 properties文件内容
# 特殊的Map key=String value=String
userService = com.deom_03.UserServiceImpl
userDao = com.deom_03.UserDaoImpl
TestDemo_03.java
public class TestDemo_03 {
@Test
public void testDemo() {
//UserService userService = new UserServiceImpl(); //存在耦合
//UserService userService = BeanFactory.getUserService(); //解耦合(简单工厂)
UserService userService = (UserService) BeanFactory.getBean("userService"); //通用工厂
User user = new User("小零","123456");
userService.register(user);
userService.Login("小零","123456");
}
}
总结
通用工厂使用方法:
1. 定义类型(类)
2. 通过配置文件告知工厂
key = value
3. 通过工厂获得类的对象
Object ob = BeanFactory.getBean("key");
三、使用Spring IoC创建实例对象(重点)
与 使用自定义工厂创建实例对象 类似
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
UserServiceImpl.java
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void register(User user) {
userDao.createUser(user);
}
public void login(String name, String pass) {
userDao.queryUserNP(name,pass);
}
}
SpringIoCTest.java
public class SpringIoCTest {
@Test
public void Test_01() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationConfig.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
User user = (User) applicationContext.getBean("user");
userService.register(user);
userService.login(user.getName(),user.getPassword());
}
}
applicationConfig.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.demo_04.UserDaoImpl"/>
<bean id="user" class="com.demo_04.User">
<property name="name" value="夏末"/>
<property name="password" value="123456"/>
</bean>
<bean id="userService" class="com.demo_04.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
代码图解:
总结
开发过程
1. 创建类
2. 编写配置文件 applicationConfig.xml
<bean id = "user" class = "com.demo_04.User" />
3. 通过工厂类获得对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationConfig.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
User user = (User) applicationContext.getBean("user");
注意事项:
ApplicationContext
接口- 非
web
环境下使用:ClassPathXmlApplicationContext
例如:main ,junit web
环境下使用:XmlWebApplicationContext
- 非
配置文件要点:
1.只有class
属性
<bean class="com.demo_04.User"> <!-- 则默认id值为:`com.demo_04.User#0` -->
2.name
属性
为bean
对象定义别名,可以定义多个,但id
只能有一个
<bean id="userDao" name="u1,u2" class="com.demo_04.UserDaoImpl"/>
3.实体对象(entity
)由持久层框架进行创建
常用方法
getBean(String str,Class<T> aclass);
不需要强转类型getBean(Class<T> aclass);
适用于Spring配置文件中只有一个bean的class是Xxxx类型>getBeanDefinitionNames();
获取Spring配置文件中所有bean标签的id值,返回值为String[]getBeanNamesForType(Class<?> aClass);
根据类型获取Spring配置文件中对应的所有bean标签的id值containsBeanDefinition(String str)
判断是否存在指定的id值的bean,只能通过ID值判断,返回值为booleancontainsBean(String str)
判断是否存在指定的id值的bean,也可以通过name值判断,返回值为boolean