写点什么

【Spring 工厂】工厂设计模式、第一个 Spring 程序细节分析、整合日志框架

  • 2021 年 11 月 11 日
  • 本文字数:3353 字

    阅读完需:约 11 分钟

  1. 代理

  2. 模板

  3. 策略


什么是设计模式?


  • ?义概念:面向对象设计中,解决特定问题的经典代码。

  • 狭义概念:GOF4 人帮定义的 23 种设计模式:工厂、适配器、装饰器、门面、代理、模板…


工厂设计模式




什么是工厂设计模式?


User user = new User();


UserDAO userDAO = new UserDAOImpl();


  1. 好处:解耦合


耦合:指定是代码间的强关联关系,?方的改变会影响到另?方;


问题:不利于代码维护;


UserService userService = new UserServiceImpl();

简单工厂的设计

package com.baizhiedu.basic;


import java.io.IOException;


import java.io.InputStream;


import java.util.Properties;


public class BeanFactory {


private static Properties env = new Properties();


static{


try {


//第一步 获得 IO 输入流


InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");


//第二步 文件内容 封装 Properties 集合中 key = userService value = com.baizhixx.UserServiceImpl


env.load(inputStream);


inputStream.close();


} catch (IOException e) {


e.printStackTrace();


}


}


/*


对象的创建方式:


  1. 直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();

  2. 通过反射的形式 创建对象 解耦合


Class clazz = Class.forName("com.baizhiedu.basic.UserServiceImpl");


UserService userService = (UserService)clazz.newInstance();


*/


public static UserService getUserService() {


UserService userService = null;


try {


//com.baizhiedu.basic.UserServiceImpl


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;


}


public static UserDAO getUserDAO(){


UserDAO userDAO = null;


try {


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 集合 存储 Properties 文件的内容

特殊 Map key=String value=String

Properties [userService = com.baizhiedu.xxx.UserServiceImpl]

Properties.getProperty("userService")

userService = com.baizhiedu.basic.UserServiceImpl


userDAO = com.baizhiedu.basic.UserDAOImpl

通用工厂的设计

问题:简单工厂会存在大量的代码冗余。



通用工厂的代码:


package com.baizhiedu.basic;


import java.io.IOException;


import java.io.InputStream;


import java.util.Properties;


public class BeanFactory {


private static Properties env = new Properties();


static{


try {


//第一步 获得 IO 输入流


InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");


//第二步 文件内容 封装 Properties 集合中 key = userService value = com.baizhixx.UserServiceImpl


env.load(inputStream);


inputStream.close();


} catch (IOException e) {


e.printStackTrace();


}


}


/*


key 小配置文件中的 key [userDAO,userService]


*/


public static Object getBean(String key){


Object ret = null;


try {


Class clazz = Class.forName(env.getProperty(key));


ret = clazz.newInstance();


} catch (Exception e) {


e.printStackTrace();


}


return ret;


}


}


配置文件 applicationContext.properties:

Properties 集合 存储 Properties 文件的内容

特殊 Map key=String value=String

Properties [userService = com.baizhiedu.xxx.UserServiceImpl]

Properties.getProperty("userService")

userService = com.baizhiedu.basic.UserServiceImpl


userDAO = com.baizhiedu.basic.UserDAOImpl

通用工厂的使用方式

  1. 定义类型 (类)

  2. 通过配置文件的配置告知工厂


applicationContext.propertieskey = value


  1. 通过工厂获得类的对象


Object ret = BeanFactory.getBean("key");


总结


Spring 本质:工厂 ApplicationContext (applicationContext.xml)


第一个 Spring 程序


================================================================================


环境搭建




依赖查询网站:https://mvnrepository.com/


配置 Spring 的 jar 包:


<dependency>


<groupId>org.springframework</groupId>


<artifactId>spring-context</artifactId>


<version>5.1.4.RELEASE</version>


</dependency>


Spring 的配置文件:


  1. 配置文件的放置位置:任意位置,没有硬性要求;

  2. 配置文件的命名 :没有硬性要求,建议:**applicationCon


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


text.xml**;


思考:日后应用 Spring 框架时,需要进行配置文件路径的设置。


Spring 的核心 API




ApplicationContext


  • 作用:Spring 提供的 ApplicationContext 这个工厂,用于对象的创建;


好处:解耦合


  • ApplicationContext 是接口类型;


接口:屏蔽实现的差异


非 web 环境 (main junit) :ClassPathXmlApplicationContext


web 环境 :XmlWebApplicationContext



  • 重量级资源:


ApplicationContext 工厂的对象占用大量内存。


不会频繁的创建对象 ,?个应用只会创建?个工厂对象。


A pplicationContext 工厂:?定是线程安全的(多线程并发访问)。


程序开发




  1. 创建类型:Person.java


public class Person {}


  1. 配置文件的配置:


<?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="person" class="com.yusael.basic.Person"/>


</beans>


  1. 通过工厂类,获得对象


/**


  • 用于测试 Spring 的第一个程序


*/


@Test


public void test() {


// 1、获取 spring 的工厂


ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");


// 2、通过工厂类获得对象


Person person = (Person)ctx.getBean("person");


System.out.println(person);


}


细节分析




名词解释:Spring 工厂创建的对象,叫做 bean 或者 组件 (componet);

Spring 工厂的相关的方法

getBean:传入 id 值 和 类名 获取对象,不需要强制类型转换。


// 通过这种方式获得对象,就不需要强制类型转换


Person person = ctx.getBean("person", Person.class);


System.out.println("person = " + person);


getBean:只指定类名,Spring 的配置文件中只能有一个 bean 是这个类型。


// 使用这种方式的话, 当前 Spring 的配置文件中 只能有一个 bean class 是 Person 类型


Person person = ctx.getBean(Person.class);


System.out.println("person = " + person);


getBeanDefinitionNames:获取 Spring 配置文件中所有的 bean 标签的 id 值。


// 获取的是 Spring 工厂配置文件中所有 bean 标签的 id 值 person person1


String[] beanDefinitionNames = ctx.getBeanDefinitionNames();


for (String beanDefinitionName : beanDefinitionNames) {


System.out.println("beanDefinitionName = " + beanDefinitionName);


}


getBeanNamesForType:根据类型获得 Spring 配置文件中对应的 id 值。


// 根据类型获得 Spring 配置文件中对应的 id 值


String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);


for (String id : beanNamesForType) {


System.out.println("id = " + id);


}


containsBeanDefinition:用于判断是否存在指定 id 值的 bean,不能判断 name 值


// 用于判断是否存在指定 id 值的 bean,不能判断 name 值


if (ctx.containsBeanDefinition("person")) {


System.out.println(true);


} else {


System.out.println(false);


}


containsBean:用于判断是否存在指定 id 值的 bean,也可以判断 name 值


// 用于判断是否存在指定 id 值的 bean,也可以判断 name 值


if (ctx.containsBean("p")) {

评论

发布
暂无评论
【Spring 工厂】工厂设计模式、第一个Spring程序细节分析、整合日志框架