Spring框架 工厂特性

目录

Spring 工厂创建对象的模式

Spring 工厂创建对象的原理

Spring 工厂管理组件声明周期

Spring 工厂好处


Spring 工厂创建对象的模式

单例:工厂默认在创建对象时都是使用单例方式,单例方式无论在工厂获取多少次,始终获取的是同一个对象

  • 默认 Spring 在管理组件对象是 单例创建(singleton)

    例如:service、dao
  • 如何修改工厂创建组件对象为多例  

    struts2 中 action 必须以多例形式管理,否则避免数据共同使用
    <!--
       单例/多例
       scope:
              singleton 单例模式
              prototype 多例模式
    -->
    <bean id="userService" class="com.grocery.service.UserService" scope="singleton" />


Spring 工厂创建对象的原理

        原理:反射 + 构造方法

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        // 启动容器
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

        // 获取容器中对象
        UserService userService = (UserService) context.getBean("userService");
        System.out.println(userService);

        // 利用反射获取Bean(工厂原理)
        UserService userService1 = (UserService) Class.forName("com.grocery.service.UserService").newInstance();
        System.out.println(userService1);
    }

Spring 工厂管理组件声明周期

        1、组件对象什么时候创建

                工厂启动,工厂中所有单例对象随之创建

                工厂使用(获取)创建多例对象

        2、组件对象什么时候销毁

                工厂关闭,工厂中所有单例对象随之销毁

                工厂不负责多例对象销毁,由虚拟机GC销毁

import com.grocery.dao.UserDao;

public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getName(String userName){
        System.out.println("userService:" + userName);
        userDao.getName(userName);
    }

    public void init(){
        System.out.println("组件对象初始化");
    }

    public void destory(){
        System.out.println("组件对象销毁");
    }
}
    <bean id="userDao" class="com.grocery.dao.UserDao" />

    <!--
       声明周期
       init-method    在对象初始化时调用方法
       destroy-method 在对象销毁时调用方法
    -->
    <bean id="userService" class="com.grocery.service.UserService" autowire="byName" scope="singleton" init-method="init" destroy-method="destory"/>

Spring 工厂好处

  • 解耦合 使用配置文件管理 Java 类,在生产环境中更换 Java 类的实现时不需要重新部署,修改文件即可
  • 减少 JVM 内存占用 Spring 默认使用单例的模式创建 Bean,减少内存占用
  • 通过依赖注入方式建立组件,使组件与组件的关系更加清晰,方便维护管理 
  • 打造轻量级的 JAVAEE 管理    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,感谢您的提问。关于手写一个 Spring 框架,这是一个非常复杂的任务,需要深入了解 Spring 框架的原理和设计思想。如果您想要手写一个 Spring 框架,建议您先学习 Spring 框架的基本原理和核心组件,例如 IoC 容器、AOP、MVC 等。然后,您可以根据自己的需求和业务场景,逐步实现自己的 Spring 框架。当然,这需要您具备较强的 Java 编程能力和系统设计能力。希望我的回答能够帮助到您。 ### 回答2: 手写一个Spring框架是一项复杂且庞大的任务,需要深入理解Spring框架的核心概念和原理。以下是一个简要的步骤指南: 1. 了解Spring框架的核心概念和原理,包括依赖注入、面向切面编程、控制反转等。 2. 创建一个独立的IoC容器,用于管理对象的创建和依赖注入。可以通过反射机制实现对象的自动注入,同时考虑循环依赖的情况。 3. 实现一个简单的AOP框架,通过动态代理机制实现方法拦截和增强。可以使用JDK自带的动态代理或者CGLIB库等。 4. 设计和实现一个MVC框架,用于处理Web请求和返回结果。可以使用Servlet作为底层技术,设计并实现自己的DispatcherServlet。 5. 创建一个配置文件解析器,用于解析Spring配置文件中的Bean定义和依赖关系。可以使用DOM、SAX、XML解析器等。 6. 编写一个Bean工厂,负责管理Bean的生命周期和依赖关系。可以在Bean创建时对其进行初始化和销毁的处理。 7. 实现一个简单的事务管理器,用于处理数据库事务。可以使用JDBC或者类似的持久化框架。 手写一个Spring框架需要深入理解Java反射、动态代理、设计模式等知识,并具备一定的编程和架构能力。以上只是一个简要的步骤指南,实际的开发过程中还需要考虑到更多的细节和边界情况。因此,对于初学者来说,手写一个完整的Spring框架可能是一个挑战,建议先熟悉和使用官方提供的Spring框架,通过实践逐步深入理解其原理和内部实现,再考虑手写一个简化的版本。 ### 回答3: 手写一个Spring框架是一项庞大而复杂的任务,需要深入理解Spring的设计原理和内部机制。以下是手写一个简化版Spring框架的高级步骤: 第一步:实现IoC容器 IoC(控制反转)是Spring框架的核心概念,通过实现一个简单的IoC容器,来管理对象的创建和依赖注入。容器可以采用单例模式,在初始化时读取配置文件,通过反射实例化并注入依赖。容器根据配置文件中的Bean定义,创建并管理对象之间的依赖关系。 第二步:实现依赖注入 依赖注入是Spring框架的另一个重要概念,通过实现依赖注入功能,实现对象之间的解耦。可以通过反射遍历对象的属性,扫描注解或配置文件,将依赖的对象自动注入到属性中。 第三步:实现AOP功能 AOP(面向切面编程)是Spring框架中提供的另一个重要功能,通过实现AOP功能,能够在不修改原有代码的情况下,对业务逻辑进行增强。可以使用动态代理等机制,在目标方法的前后增加额外的操作。 第四步:实现Web MVC功能 Spring框架还提供了强大的Web MVC功能,通过实现简化版的请求处理、路由和视图解析等功能,来实现一个基本的Web应用。可以通过Servlet或者自定义HttpHandler来处理请求,并使用模板引擎等技术进行视图解析和渲染。 第五步:实现其他特性 除了上述核心功能外,Spring框架还提供了诸如事务管理、数据访问、安全等一系列扩展功能。可以根据实际需要,逐步实现这些特性。 最后,为了保持代码的可维护性和可扩展性,建议使用设计模式、模块化的方式来实现框架的各个功能。此外,持续学习和了解Spring框架的最新发展和技术变化,可以帮助优化和提升手写框架的质量和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值