- 浏览: 68881 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
颓废主义:
楼主敢不敢把你的原文删除了,或者把更正的内容放后边,然后附上原 ...
spring源码分析-controller的线程安全 -
_Yggd:
嗯,大神学习了
模板方法和Callback回调应用实践-自己动手写JdbcTemplate(附源码) -
chinagdvea:
为啥我觉得通过传入匿名类的方法实现方法调用,这是成了策略模式么 ...
模板方法和Callback回调应用实践-自己动手写JdbcTemplate(附源码) -
finallygo:
ameer 写道finallygo 写道ame ...
模板方法和Callback回调应用实践-自己动手写JdbcTemplate(附源码) -
ameer:
finallygo 写道ameer 写道finallygo 写 ...
模板方法和Callback回调应用实践-自己动手写JdbcTemplate(附源码)
原创 Spring源代码分析(9)---FactoryBean(我是谁,谁是我,谁是谁) 收藏
本节,我们最分析ioc的最后一个核心点,那就是FactoryBean;
在ioc中,存在着这样的一种bean,他的引用并不是只想他自身,而是通过折射指向了别的bean,就因为他的存在,使得他支持了jdbc,jndi等多种j2ee技术,他维持了 spring的80%的功能的实现,那么,就让我们来详细的分析一些这个神奇的bean,就好像武林外传里面的秀才杀死姬无命一样的,谁到底是谁,我们看似在取得factoryBean,却拿到了另外的一个类,失之东隅,收之桑榆;
我们以 MethodInvokingFactoryBean为例子,这是一个很奇妙的bean,如下配置:
1. <bean name="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
2. <property name="staticMethod">
3. <value>org.corey.demo.Demo.staticMethod</value>
4. </property>
5. </bean>
6.
7.
8.
我们在代码:
1. ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
2.
3. ac.getBean("methodInvoke");
1. ac.getBean("methodInvoke");返回的是org.corey.demo.Demo 类的staticMethod方法的返回值;
那么,我们来看一下这些都是怎么实现的:
我们具体来看下几个类的代码:
1. public interface FactoryBean {
2.
3.
4. Object getObject() throws Exception;
5.
6. Class getObjectType();
7.
8.
9. boolean isSingleton();
10.
11. }
InitializingBean 接口的话,我们已经不用介绍了;
MethodInvoker类主要含有这几个类:
1. private Class targetClass;
2.
3. private Object targetObject;
4.
5. private String targetMethod;
6.
7. private Object[] arguments;
8.
9. // the method we will call
10. private Method methodObject;
MethodInvoker 类正式实现了MethodInvokingFactoryBean方法转嫁的核心功能,我们从入口来分析一下这个类:
1. public void afterPropertiesSet() throws Exception {
2. prepare();
3. if (this.singleton) {
4. Object obj = doInvoke();
5. this.singletonObject = (obj != null ? obj : MethodInvoker.VOID);
6. }
7. }
这是MethodInvokingFactoryBean的初始化方法:
1. ublic void prepare() throws ClassNotFoundException, NoSuchMethodException {
2. if (this.targetClass == null) {
3. throw new IllegalArgumentException("Either targetClass or targetObject is required");
4. }
5. if (this.targetMethod == null) {
6. throw new IllegalArgumentException("targetMethod is required");
7. }
8.
9. if (this.arguments == null) {
10. this.arguments = new Object[0];
11. }
12.
13. Class[] argTypes = new Class[this.arguments.length];
14. for (int i = 0; i < this.arguments.length; ++i) {
15. argTypes[i] = (this.arguments[i] != null ? this.arguments[i].getClass() : Object.class);
16. }
17.
18. // Try to get the exact method first.
19. try {
20. this.methodObject = this.targetClass.getMethod(this.targetMethod, argTypes);
21. }
22. catch (NoSuchMethodException ex) {
23. // Just rethrow exception if we can't get any match.
24. this.methodObject = findMatchingMethod();
25. if (this.methodObject == null) {
26. throw ex;
27. }
28. }
29.
30. if (this.targetObject == null && !Modifier.isStatic(this.methodObject.getModifiers())) {
31. throw new IllegalArgumentException("Target method must not be non-static without a target");
32. }
33. }
将你在xml文件中配置的MethodInvokingFactoryBean的属性(字符串)转化成为元数据,为等下的调用做准备;
1. private Object doInvoke() throws Exception {
2. try {
3. return invoke();
4. }
5. catch (InvocationTargetException ex) {
6. if (ex.getTargetException() instanceof Exception) {
7. throw (Exception) ex.getTargetException();
8. }
9. if (ex.getTargetException() instanceof Error) {
10. throw (Error) ex.getTargetException();
11. }
12. throw ex;
13. }
14. }
1. public Object invoke() throws InvocationTargetException, IllegalAccessException {
2. if (this.methodObject == null) {
3. throw new IllegalStateException("prepare() must be called prior to invoke() on MethodInvoker");
4. }
5. // In the static case, target will just be <code>null</code>.
6. return this.methodObject.invoke(this.targetObject, this.arguments);
7. }
8.
9.
在这里分别调用了开始准备的目标类和目标方法;得到结果并且把他存储在singletonObject中,
在factoryBean接口中,实现了这个方法:
1. public Object getObject() throws Exception {
2. if (this.singleton) {
3. // Singleton: return shared object.
4. return this.singletonObject;
5. }
6. else {
7. // Prototype: new object on each call.
8. Object retVal = doInvoke();
9. return (retVal != null ? retVal : MethodInvoker.VOID);
10. }
11. }
用 getObject把真正的bean返回出去了,那么,现在我们的疑问来了,我们在getBean的时候,什么时候调用了这个getObject()方法呢???
我们来看一下getBean的实现:
在AbstractBeanFactory中,
public Object getBean(String name, Class requiredType, Object[] args) throws BeansException
是一个典型的模板模式的应用,他的createBean();在 AbstractAutowireCapableBeanFactory实现,他负责从BeanDefinition构造出一个Objct,而 getBean在拿到这个Object后,就会调用第三步:
bean = getObjectForSharedInstance(name, sharedInstance);
从这个Object类中拿到一个真正我们要返回出去的bean,而这里主要就是我们的factoryBean的处理;
1. protected Object getObjectForSharedInstance(String name, Object beanInstance) throws BeansException {
2. String beanName = transformedBeanName(name);
3.
4. // Don't let calling code try to dereference the
5. // bean factory if the bean isn't a factory.
6. if (isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
7. throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
8. }
9.
10. // Now we have the bean instance, which may be a normal bean or a FactoryBean.
11. // If it's a FactoryBean, we use it to create a bean instance, unless the
12. // caller actually wants a reference to the factory.
13. if (beanInstance instanceof FactoryBean) {
14. if (!isFactoryDereference(name)) {
15. // Return bean instance from factory.
16. FactoryBean factory = (FactoryBean) beanInstance;
17. if (logger.isDebugEnabled()) {
18. logger.debug("Bean with name '" + beanName + "' is a factory bean");
19. }
20. try {
21. beanInstance = factory.getObject();
22. }
23. catch (Exception ex) {
24. throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
25. }
26. if (beanInstance == null) {
27. throw new FactoryBeanNotInitializedException(
28. beanName, "FactoryBean returned null object: " +
29. "probably not fully initialized (maybe due to circular bean reference)");
30. }
31. }
32. else {
33. // The user wants the factory itself.
34. if (logger.isDebugEnabled()) {
35. logger.debug("Calling code asked for FactoryBean instance for name '" + beanName + "'");
36. }
37. }
38. }
39.
40. return beanInstance;
41. }
transformedBeanName去掉了beanName的&符号;
isFactoryDereference(name)判断一个类名是不是以&开头,如果这个类是FactoryBean并且beanName以&开头,那么则返回这个FactoryBean的本身,如果不是以&开始,则返回他所要转换的类;
beanInstance = factory.getObject();
就这样,我们在不知不觉的就完成这次南水北调的转换! *_*
最后,我们来总结一下Spring代码的此功能实现,在整个实现中,spring的代码都很有调理,很好的体现了面向接口编程,几乎每个具体的类(工具类除外)都是从接口开始着手,并且一层一层就想洋葱一样展现在我们的眼前,比如,首先,抽象出来一个顶层的factoryBean接口,提供了bean转换的统一接口,为我们组合型模板方式提供了可能,我们只要在beanFactory中调用他的getObject,而不必管这个类是从jndi还是从别的类的方法中得到的,从而把BeanFactory与具体的FactoryBean实现解耦开来,而且在MethodInvokingFacrotyBean中,我们把转换方法的实现用继承的方式委托给了MethodInvoker,功能复用的方式有两种,一种如这个一样的继承,坏处就是这是一种编译器的复用,无法实现策略模式一样的转换算法的功能,但是他好的就是我们不用显示的把委托代码重新写一次,而组合复用的好处是我们可以更换不同的MethodInvoker的实现,如果这里的targetClass和targetMethod有另外的处理方式,即MethodInvoker有另外的实现方式,我们可以考虑使用,如果没有的话,我们选择更方便的继承方式;
在代码中,大量的使用了工具类,这是单一职责原则的体现,为了避免意外的情况发生,或者说用户的盲目扩展,很多公开地方做了防御性的判断,并且在意外情况发生,输入参数非法的地方,抛出了明确的异常,这正式代码大全里所说的防御性编程的良好的体现,往往是这么一些微小的细节,更加的体现了大牛们代码的质量;设计的合理;这些都是值得我们深入去研究的地方;
因为我也初出茅庐,这些文章也只是我看spring源代码的一些小小的心得,在分享给有需要的朋友的同时,其实更多的是给自己招一个随处可得的笔记本,希望大家能够多多交流,在前面的getBean方法中也许分析得有些模糊,但是通过前几节对反射的重新复习,cglib的应用和asm的了解,和对ioc的代码一些全局的了解,现在我们再去看getBean代码,基本上不存在着什么疑问,至少我是这样的;所以,我想ioc的分析,应该就差不多到这里了,而spring的微核就是这个ioc容器,搞清楚这些对我们将来分析外围打下一个良好的基础;
http://blog.csdn.net/turkeyzhou/archive/2008/09/24/2974922.aspx
本节,我们最分析ioc的最后一个核心点,那就是FactoryBean;
在ioc中,存在着这样的一种bean,他的引用并不是只想他自身,而是通过折射指向了别的bean,就因为他的存在,使得他支持了jdbc,jndi等多种j2ee技术,他维持了 spring的80%的功能的实现,那么,就让我们来详细的分析一些这个神奇的bean,就好像武林外传里面的秀才杀死姬无命一样的,谁到底是谁,我们看似在取得factoryBean,却拿到了另外的一个类,失之东隅,收之桑榆;
我们以 MethodInvokingFactoryBean为例子,这是一个很奇妙的bean,如下配置:
1. <bean name="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
2. <property name="staticMethod">
3. <value>org.corey.demo.Demo.staticMethod</value>
4. </property>
5. </bean>
6.
7.
8.
我们在代码:
1. ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
2.
3. ac.getBean("methodInvoke");
1. ac.getBean("methodInvoke");返回的是org.corey.demo.Demo 类的staticMethod方法的返回值;
那么,我们来看一下这些都是怎么实现的:
我们具体来看下几个类的代码:
1. public interface FactoryBean {
2.
3.
4. Object getObject() throws Exception;
5.
6. Class getObjectType();
7.
8.
9. boolean isSingleton();
10.
11. }
InitializingBean 接口的话,我们已经不用介绍了;
MethodInvoker类主要含有这几个类:
1. private Class targetClass;
2.
3. private Object targetObject;
4.
5. private String targetMethod;
6.
7. private Object[] arguments;
8.
9. // the method we will call
10. private Method methodObject;
MethodInvoker 类正式实现了MethodInvokingFactoryBean方法转嫁的核心功能,我们从入口来分析一下这个类:
1. public void afterPropertiesSet() throws Exception {
2. prepare();
3. if (this.singleton) {
4. Object obj = doInvoke();
5. this.singletonObject = (obj != null ? obj : MethodInvoker.VOID);
6. }
7. }
这是MethodInvokingFactoryBean的初始化方法:
1. ublic void prepare() throws ClassNotFoundException, NoSuchMethodException {
2. if (this.targetClass == null) {
3. throw new IllegalArgumentException("Either targetClass or targetObject is required");
4. }
5. if (this.targetMethod == null) {
6. throw new IllegalArgumentException("targetMethod is required");
7. }
8.
9. if (this.arguments == null) {
10. this.arguments = new Object[0];
11. }
12.
13. Class[] argTypes = new Class[this.arguments.length];
14. for (int i = 0; i < this.arguments.length; ++i) {
15. argTypes[i] = (this.arguments[i] != null ? this.arguments[i].getClass() : Object.class);
16. }
17.
18. // Try to get the exact method first.
19. try {
20. this.methodObject = this.targetClass.getMethod(this.targetMethod, argTypes);
21. }
22. catch (NoSuchMethodException ex) {
23. // Just rethrow exception if we can't get any match.
24. this.methodObject = findMatchingMethod();
25. if (this.methodObject == null) {
26. throw ex;
27. }
28. }
29.
30. if (this.targetObject == null && !Modifier.isStatic(this.methodObject.getModifiers())) {
31. throw new IllegalArgumentException("Target method must not be non-static without a target");
32. }
33. }
将你在xml文件中配置的MethodInvokingFactoryBean的属性(字符串)转化成为元数据,为等下的调用做准备;
1. private Object doInvoke() throws Exception {
2. try {
3. return invoke();
4. }
5. catch (InvocationTargetException ex) {
6. if (ex.getTargetException() instanceof Exception) {
7. throw (Exception) ex.getTargetException();
8. }
9. if (ex.getTargetException() instanceof Error) {
10. throw (Error) ex.getTargetException();
11. }
12. throw ex;
13. }
14. }
1. public Object invoke() throws InvocationTargetException, IllegalAccessException {
2. if (this.methodObject == null) {
3. throw new IllegalStateException("prepare() must be called prior to invoke() on MethodInvoker");
4. }
5. // In the static case, target will just be <code>null</code>.
6. return this.methodObject.invoke(this.targetObject, this.arguments);
7. }
8.
9.
在这里分别调用了开始准备的目标类和目标方法;得到结果并且把他存储在singletonObject中,
在factoryBean接口中,实现了这个方法:
1. public Object getObject() throws Exception {
2. if (this.singleton) {
3. // Singleton: return shared object.
4. return this.singletonObject;
5. }
6. else {
7. // Prototype: new object on each call.
8. Object retVal = doInvoke();
9. return (retVal != null ? retVal : MethodInvoker.VOID);
10. }
11. }
用 getObject把真正的bean返回出去了,那么,现在我们的疑问来了,我们在getBean的时候,什么时候调用了这个getObject()方法呢???
我们来看一下getBean的实现:
在AbstractBeanFactory中,
public Object getBean(String name, Class requiredType, Object[] args) throws BeansException
是一个典型的模板模式的应用,他的createBean();在 AbstractAutowireCapableBeanFactory实现,他负责从BeanDefinition构造出一个Objct,而 getBean在拿到这个Object后,就会调用第三步:
bean = getObjectForSharedInstance(name, sharedInstance);
从这个Object类中拿到一个真正我们要返回出去的bean,而这里主要就是我们的factoryBean的处理;
1. protected Object getObjectForSharedInstance(String name, Object beanInstance) throws BeansException {
2. String beanName = transformedBeanName(name);
3.
4. // Don't let calling code try to dereference the
5. // bean factory if the bean isn't a factory.
6. if (isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
7. throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
8. }
9.
10. // Now we have the bean instance, which may be a normal bean or a FactoryBean.
11. // If it's a FactoryBean, we use it to create a bean instance, unless the
12. // caller actually wants a reference to the factory.
13. if (beanInstance instanceof FactoryBean) {
14. if (!isFactoryDereference(name)) {
15. // Return bean instance from factory.
16. FactoryBean factory = (FactoryBean) beanInstance;
17. if (logger.isDebugEnabled()) {
18. logger.debug("Bean with name '" + beanName + "' is a factory bean");
19. }
20. try {
21. beanInstance = factory.getObject();
22. }
23. catch (Exception ex) {
24. throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
25. }
26. if (beanInstance == null) {
27. throw new FactoryBeanNotInitializedException(
28. beanName, "FactoryBean returned null object: " +
29. "probably not fully initialized (maybe due to circular bean reference)");
30. }
31. }
32. else {
33. // The user wants the factory itself.
34. if (logger.isDebugEnabled()) {
35. logger.debug("Calling code asked for FactoryBean instance for name '" + beanName + "'");
36. }
37. }
38. }
39.
40. return beanInstance;
41. }
transformedBeanName去掉了beanName的&符号;
isFactoryDereference(name)判断一个类名是不是以&开头,如果这个类是FactoryBean并且beanName以&开头,那么则返回这个FactoryBean的本身,如果不是以&开始,则返回他所要转换的类;
beanInstance = factory.getObject();
就这样,我们在不知不觉的就完成这次南水北调的转换! *_*
最后,我们来总结一下Spring代码的此功能实现,在整个实现中,spring的代码都很有调理,很好的体现了面向接口编程,几乎每个具体的类(工具类除外)都是从接口开始着手,并且一层一层就想洋葱一样展现在我们的眼前,比如,首先,抽象出来一个顶层的factoryBean接口,提供了bean转换的统一接口,为我们组合型模板方式提供了可能,我们只要在beanFactory中调用他的getObject,而不必管这个类是从jndi还是从别的类的方法中得到的,从而把BeanFactory与具体的FactoryBean实现解耦开来,而且在MethodInvokingFacrotyBean中,我们把转换方法的实现用继承的方式委托给了MethodInvoker,功能复用的方式有两种,一种如这个一样的继承,坏处就是这是一种编译器的复用,无法实现策略模式一样的转换算法的功能,但是他好的就是我们不用显示的把委托代码重新写一次,而组合复用的好处是我们可以更换不同的MethodInvoker的实现,如果这里的targetClass和targetMethod有另外的处理方式,即MethodInvoker有另外的实现方式,我们可以考虑使用,如果没有的话,我们选择更方便的继承方式;
在代码中,大量的使用了工具类,这是单一职责原则的体现,为了避免意外的情况发生,或者说用户的盲目扩展,很多公开地方做了防御性的判断,并且在意外情况发生,输入参数非法的地方,抛出了明确的异常,这正式代码大全里所说的防御性编程的良好的体现,往往是这么一些微小的细节,更加的体现了大牛们代码的质量;设计的合理;这些都是值得我们深入去研究的地方;
因为我也初出茅庐,这些文章也只是我看spring源代码的一些小小的心得,在分享给有需要的朋友的同时,其实更多的是给自己招一个随处可得的笔记本,希望大家能够多多交流,在前面的getBean方法中也许分析得有些模糊,但是通过前几节对反射的重新复习,cglib的应用和asm的了解,和对ioc的代码一些全局的了解,现在我们再去看getBean代码,基本上不存在着什么疑问,至少我是这样的;所以,我想ioc的分析,应该就差不多到这里了,而spring的微核就是这个ioc容器,搞清楚这些对我们将来分析外围打下一个良好的基础;
http://blog.csdn.net/turkeyzhou/archive/2008/09/24/2974922.aspx
发表评论
-
iReport的一个异常与json的冲突问题
2010-10-27 14:15 3092今天在调试iReport 3.7.5时,忽然报这样一个错: ... -
使用@Transactional时候的注意点
2010-10-11 18:21 3963使用@Transactional时候的注意点: 1.确认有如下 ... -
spring源码分析-浅淡工厂模式的应用
2010-07-09 14:33 4739一谈到spring,它可是集设计之大成,今天我们来浅谈一下sp ... -
struts1.x源码赏析-action是线程安全性讨论
2010-07-09 11:59 2050经过对struts1.x源码的研 ... -
深入整体分析Spring MVC framework
2010-07-06 10:44 1211在当今的MVC framework里, ... -
Log4j源代码阅读—Log4j初始化
2010-07-04 19:30 3549一、Log4j的初始化(LogMa ... -
一项浩大的JAVA编码工程(与unix兼容乱码问题)
2010-06-24 19:00 1853注:开发IDE是eclilpse,本地开发环境是windows ... -
开始接触MQ了
2010-06-23 17:15 1392新公司项目使用MQ进行消息调用,用的是SonicMQ的实现,来 ... -
使用Spring JMS和SonicMQ实现异步通信
2010-06-23 16:50 3591第一步:SonicMQ的安装准备 1、安装Sonic ... -
[企业应用]一个实用的去除前后空格的小工具
2009-09-11 13:35 1049企业开发中往往有这样的需求,用户界面输入的东西都要去除前后 ... -
[原创][Annation、范型和反射的具体应用]属性获取器
2009-07-24 16:08 1566范型和Annation是JDK 1.5的新特性,好多朋友 ... -
JSTL 中headerValues的问题
2008-01-22 13:54 1278直接在JSP中写 ${header.host }可以输出:lo ... -
EL表达式与"点"的问题
2008-01-20 15:21 1103EL表达式所带来的便利是众所周知的,但小弟在使用过程中有一小问 ... -
Eclipse高级操作 远程调试
2007-08-16 21:18 1944Eclipse高级操作 远程调试 JPDA是SUN JDK自 ...
相关推荐
我们分别定义了一个MessageSender对象(messageSenderImpl)和一个Before Advice对象(logBeforeAdvice),并定义了一个 org.springframework.aop.framework.ProxyFactoryBean对象(messageSender),FactoryBean或...
在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...
本文将围绕"spring-boot-starter-mybatis-spring-boot-2.1.0.zip"这一资源,详细介绍如何在Spring Boot 2.1.0版本中集成并使用MyBatis。 首先,"spring-boot-starter-mybatis"是Spring Boot为MyBatis提供的起步依赖...
在`spring-boot-starter-mybatis-spring-boot-2.1.1.zip`这个压缩包中,包含了该启动器的相应版本,方便开发者进行免费下载和使用。 集成MyBatis到Spring Boot项目的第一步是添加依赖。在`pom.xml`文件中,我们需要...
下面我们将逐步分析`FactoryBean`的相关测试代码: 1. **配置文件(spring.xml)** 在Spring的XML配置文件中,我们可以声明一个`FactoryBean`。例如,假设我们有一个名为`MyFactoryBean`的实现类,它继承了`...
MyBatis-Spring 是一个将 MyBatis ORM 框架与 Spring 框架集成的库,使得在 Spring 应用中使用 MyBatis 变得更加方便。mybatis-spring-1.3.3.jar 文件是这个集成库的一个版本,提供了对 MyBatis 1.3.3 和 Spring 的...
通过阅读Spring框架的源代码,我们可以看到FactoryBean接口的实现如何影响IoC容器的行为,以及`getObject()`和`isSingleton()`方法如何被容器调用来生成和管理Bean实例。 至于"工具"标签,FactoryBean也是Spring...
源代码是理解任何软件系统内部运作的关键,对于Spring框架而言,通过阅读源码,我们可以深入理解其设计理念和实现机制。 在Spring框架的源代码中,有几个关键部分值得我们关注: 1. **IoC容器**:这是Spring的核心...
本项目"spring-demo03-spring创建对象的5种方式.zip"着重探讨了Spring如何实例化对象,让我们详细了解一下这五种方法。 1. **XML配置**: Spring最初的配置方式是通过XML文件,例如`beans.xml`。在XML中定义Bean,...
在Spring框架中,`FactoryBean`是一个非常重要的接口,它允许我们自定义对象的创建方式。这个接口使得我们可以实现自己的工厂逻辑,返回一个完全初始化、配置好的对象,甚至可以是带有额外增强功能的对象,比如代理...
在Java Web开发中,Spring框架和MyBatis-Plus的集成是常见的数据访问技术组合。Spring作为一款强大的轻量级框架,提供了依赖注入、AOP(面向切面编程)等功能,而MyBatis-Plus则是在MyBatis的基础上进行扩展,简化了...
当Spring Boot与MyBatis结合时,可以极大地提升开发效率,同时保持代码的简洁性。本文将深入探讨Spring Boot 2.1.3版本中集成MyBatis的相关知识点。 一、Spring Boot Starter MyBatis简介 Spring Boot Starter ...
Spring框架是一套全面的企业级应用程序开发框架,它为开发者提供了一系列功能,以简化企业级应用的开发和维护。以下是从给定文件内容中提取的关于Spring框架的知识点: 1. Spring框架的基本概念与设置 - Spring...
在整个源代码分析中,我们可以看到 Spring 实现声明式事务管理有三个部分: 1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性...
首先,Spring Boot 提供了对 Spring Cache 的自动化配置,使得开发者能够快速地在应用中启用缓存,而无需编写大量的配置代码。Spring Cache 是 Spring 框架的一部分,它提供了一个抽象层,允许你在不同的缓存提供商...
《MyBatis-Spring整合源码深度解析》 在Java开发领域,MyBatis和Spring是两个非常重要的框架,它们分别在持久层和容器管理方面提供了强大的支持。MyBatis-Spring则是这两个框架的完美结合,它使得MyBatis与Spring...
《MyBatis-Spring 1.0.1 框架深度解析》 MyBatis-Spring 是一个轻量级的框架,它将 MyBatis 和 Spring 进行了无缝集成,使得在 Spring 应用中使用 MyBatis 变得更加简单。这个名为 "mybatis-spring-1.0.1-bundle....
在Spring框架中,FactoryBean是一个非常重要的概念,它允许我们自定义对象的创建方式,提供了扩展Spring IoC容器的能力。FactoryBean是Spring提供的一种特殊类型的bean,它不仅仅是一个普通的对象,还是一个工厂,...
026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和jdbctemplate使用.mp4 028-spring-ioc-三层架构组件管理实战.mp4 029-spring-ioc-基于注解方式ioc配置.mp4 030-spring-ioc-扩展...
026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和jdbctemplate使用.mp4 028-spring-ioc-三层架构组件管理实战.mp4 029-spring-ioc-基于注解方式ioc配置.mp4 030-spring-ioc-扩展...