Spring 的演化小案例及解析基础知识

一、传统方法创建实例对象

存在代码耦合的问题
在这里插入图片描述
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值判断,返回值为boolean
  • containsBean(String str)判断是否存在指定的id值的bean,也可以通过name值判断,返回值为boolean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值