备注:Aware接口spring标记接口 表示spring的回调
-
org.springframework.beans.factory.FactoryBean
/** * 调用getBean()时spring容器每次返回 getObject()方法的返回值 * */ public class Factory implements FactoryBean<Test1> { @Override public Test1 getObject() throws Exception { return new Test1(); } @Override public Class<?> getObjectType() { return Test1.class; } @Override public boolean isSingleton() { return false; } }
<!-- 屌用Factory实例,context.getBean("&t3") --> <bean id="t3" class="i.test.Factory"/>
-
org.springframework.beans.factory.BeanNameAware
/** * 得到配置文件中,id的名字 * */ public class Test3 implements BeanNameAware { private String name; @Override public void setBeanName(String name) { this.name = name; } }
<!-- 可以直接在Test3中使用这个id --> <bean id="t3" class="i.test.Test3" />
-
org.springframework.beans.factory.InitializingBean
public class Test3 implements InitializingBean { public void setName(String name) { System.out.println("-----" + name); } /** * 属性初始化后调用该方法 */ @Override public void afterPropertiesSet() throws Exception { // System.out.println("-----"); } }
<bean id="t3" class="i.test.Test3" p:name="name"/> <!-- 在没有实现上面接口时,可以通过下面配置实现同样效果 --> <bean id="t3" class="i.test.Test3" p:name="name" init-method="afterPropertiesSet"/>
-
org.springframework.beans.factory.DisposableBean
public class Test3 implements DisposableBean{ public void setName(String name) { System.out.println("-----"+name); } /** * 对象被销毁时调用的方法, * 单例模式bean与spring容器有相同的生命周期 */ @Override public void destroy() throws Exception { // System.out.println("-----"); } }
<bean id="t3" class="i.test.Test3" p:name="name" /> <!-- 在没有实现上面接口时,可以通过下面配置实现同样效果 --> <bean id="t3" class="i.test.Test3" p:name="name" destroy-method="destroy" />
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); // 让容器关闭时回调 context.registerShutdownHook();
-
import org.springframework.context.ApplicationContextAware
public class Test3 implements ApplicationContextAware { private ApplicationContext context; /** * 通过容器初始化对象 */ public Test1 getTest1() { return context.getBean("t1", Test1.class); } /** * 可以得到spring容器 */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } }
<bean id="t1" class="i.test.Test1" scope="prototype" /> <bean id="t3" class="i.test.Test3" />
-
Lookup method injection(可作为上面功能的简单实现版)
public abstract class Test3 { /** * 要求每次反回一个新的Test1实例 */ public abstract Test1 getTest1(); @Override public String toString() { System.out.println(getTest1()); return ""; } }
<bean id="t1" class="i.test.Test1" scope="prototype" /> <bean id="t3" class="i.test.Test3"> <!-- Spring框架通过使用CGLIB字节码生成工具,动态库生成的子类重写方法实现。 cglib这个包在spring3.2被集成进来 --> <lookup-method name="getTest1" bean="t1" /> </bean>
cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理,java自带的代理类工具proxy(被代理类必须要实现接口)ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); System.out.println(context.getBean("t3")); //i.test.Test3$$EnhancerByCGLIB$$86e9bbc0@f1afec5
相关推荐
下面小编就为大家带来一篇spring的几个重要类和接口(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring5 是一个重要的版本,距离Spring...随着 Java、JavaEE 和其他一些框架基准版本的增加,SpringFramework5 取消了对几个框架的支持。例如: Portlet Velocity JasperReports XMLBeans JDO Guava
传播特性有几种?7种; 某一个事务嵌套另一个事务的时候怎么办? REQUIRED_NEW和REQUIRED区别 Spring的事务是如何回滚的,实现原理; 抽象类和接口的区别,什么时候用抽象类什么时候用接口; StringBuilder和...
十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 <mvc:annotation-driven /> 到底做了什么工作 二十、 本文中springMVC.xml配置文件是...
如果一个类实现了一个或多个接口,那么Spring就会使用默认的JDK动态代理,如果没有实现任何接口,就会使用cglib来代理。当然我们也可以手动改变这些设置。这也是比较容易掉坑的部分,如果设置错了代理方式,那么在...
前段时间,分开学习了这三个框架,都是看某黄埔军校的视频,整合的部分没看视频,想自己做。...2.8 到这里,配置文件就写完了,这里注意的是,java代码没开始写,只是定义了几个包,dao\service\beans
所谓全方位,不得不说以下几个特点: 1 非侵入式:对于写代码从来不考虑复用和移植的程序员来说,这一点根本就没有吸引力,那么请跳过。所谓非侵入式是指Spring框架的API不会在业务逻辑上出现,也就是说我们的业务...
Spring MVC 教程 快速入门 深入分析 ...十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 <mvc:annotation-driven /> 到底做了什么工作
传统的API文档编写存在以下几个痛点: 66 Swagger具有以下优点 66 Swagg er 2.0 集成配置 66 Maven依赖信息 66 SwaggerConfig 68 Zull整合Swagger管理微服务所有API 68 会员和订单引入Maven依赖 68 ...
解决这个问题的办法就是“针对抽象(接口)”编程 (依赖倒置原则)。这里的抽象既包括抽象类也包括接口。我不想过多的去谈抽象类和接口的区别,在后续的例子中我们将使用接口。由于接口在进行“动态代理” 时仍能...
本代码的主要内容为 Spring Cloud 阶段性开发与测试的源码包,主要分为以下几个模块: 001-项目基础模块; 002-接入Eureka注册中心以及Eureka集群; 003-接入Ribbon负载均衡客户端组件; 004-接入Feign负载均衡...
NULL 博文链接:https://canfly2010.iteye.com/blog/443063
十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 <mvc:annotation-driven /> 到底做了什么工作 二十、 本文中springMVC.xml配置文件...
下面对这几个配置文件解释下: 1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 ...
如果有同学自己建立的话,可以按照以下几个步骤建立 1 配置web表头 2 配置加载spring-mybatis.xml 3 配置编码过滤器 4 配置加载sping-mybaties文件所需要的类 5 配置处理javabean类销毁的类 6 ...
它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 本项目集成Minio的java客户端...
原生的web项目开发过程都是上面这样,和业务相关的其实只有第2步,而其他几个步骤是每个web项目都需要的,像比较大的项目,会有很多web模块,每个模块都需要重复这些1/3/4操作步骤,还是相当繁琐的,也会耗费大量...
需要数据库,可以自行建立,建立一个tb_user 表,表中主要有id ,username loginname,password,phone,address几个字段。
执行Spring框架的运行路程通常包括以下几个重要的步骤: 应用程序启动:应用程序启动时,Spring框架会加载并初始化所需的配置文件和类。 配置加载:Spring框架会读取并加载应用程序的配置文件,例如XML配置文件或...
基于Spring Boot搭建医院信息管理系统(HIS)的过程可以分为以下几个步骤: 需求分析: 首先,您需要分析医院信息管理系统的需求,例如患者管理、医生管理、挂号、门诊、住院、药品管理、检查检验、收费结算等功能。...