首页 文章 精选 留言 我的

精选列表

搜索[ioc],共1136篇文章
优秀的个人博客,低调大师

SpringFramework核心技术一(IOC:使用ICO容器)

使用容器 这ApplicationContext是高级工厂的接口,能够维护不同bean及其依赖项的注册表。使用该方法T getBean(String name, Class requiredType)可以检索bean的实例。 一、 在ApplicationContext可以读取bean定义并访问它们,如下所示: 1.1 怎么使用容器 首先来看一下容器: 1.2 有很多同学一上来就是搞一个New,可是这是一个ApplicationContext接口啊。 //接口是不能直接new着用的,这个是重写。 ApplicationContext applicationContext = new ApplicationContext(){...} 1.3 下面这样用才是对的:ClassPathXmlApplicationContext是类 /** * @author:wangdong * @description:怎么使用容器 */ public class Test { public static void main(String[] args) { // create and configure beans //可以从XML文件中读取需要配置Bean并且加载进容器中 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); } 看一下ClassPathXmlApplicationContext类 二、下面我们来用一下 package org.springframework.test; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ApplicationContext; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.context.support.GenericGroovyApplicationContext; import org.springframework.core.ResolvableType; import org.springframework.core.env.Environment; import org.springframework.core.io.Resource; import java.io.IOException; import java.lang.annotation.Annotation; import java.util.Locale; import java.util.Map; /** * @author:wangdong * @description:怎么使用容器 */ public class Test { public static void main(String[] args) { // create and configure beans ApplicationContext context1 = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); // retrieve configured instance(检索配置实例Bean) //如果PetStoreService已经创建,并且在上面的.xml文件中已经配置 PetStoreService service = context1.getBean("petStore", PetStoreService.class); //GenericApplicationContext和ClassPathXmlApplicationContext类似 //只不过这里使用的是.groovy后缀文件 //使用Groovy配置,bootstrapping看起来非常相似,只是一个不同的上下文实现类,它可以感知Groovy(但也理解XML bean定义): ApplicationContext context2 = new GenericGroovyApplicationContext("services.groovy", "daos.groovy"); //最灵活的变体是GenericApplicationContext与.groovy和.xml结合使用 GenericApplicationContext context3 = new GenericApplicationContext(); //用于.xml后缀的文件 new XmlBeanDefinitionReader(context3).loadBeanDefinitions("services.xml", "daos.xml"); //用于.groovy后缀的文件 new GroovyBeanDefinitionReader(context3).loadBeanDefinitions("services.groovy", "daos.groovy"); } } 可以使用它getBean来检索bean的实例。该ApplicationContext 接口还有其他一些检索bean的方法,但理想情况下,应用程序代码不应该使用它们。事实上,你的应用程序代码根本不应该调用该 getBean()方法,因此完全不依赖于Spring API。例如,Spring与Web框架的集成为各种Web框架组件(如控制器和JSF托管的bean)提供了依赖注入,允许您通过元数据(例如自动装配注释)声明对特定Bean的依赖关系。 未完待续~~~持续更新

优秀的个人博客,低调大师

【死磕 Spring】----- IOC 之 深入分析 Aware 接口

doCreateBean() 方法主要干三件事情: 实例化 bean 对象: createBeanInstance() 属性注入: populateBean() 初始化 bean 对象: initializeBean() 而初始化 bean 对象时也是干了三件事情: 激活 Aware 方法 后置处理器的应用 激活自定义的 init 方法 接下来三篇文章将会详细分析这三件事情,这篇主要分析 Aware 接口。 Aware 接口定义如下: /** * Marker superinterface indicating that a bean is eligible to be * notified by the Spring container of a particular framework object * through a callback-style method. Actual method signature is * determined by individual subinterfaces, but should typically * consist of just one void-returning method that accepts a single * argument. * * <p>Note that merely implementing {@link Aware} provides no default * functionality. Rather, processing must be done explicitly, for example * in a {@link org.springframework.beans.factory.config.BeanPostProcessor BeanPostProcessor}. * Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor} * and {@link org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory} * for examples of processing {@code *Aware} interface callbacks. * * @author Chris Beams * @since 3.1 */ public interface Aware { } Aware 接口为 Spring 容器的核心接口,是一个具有标识作用的超级接口,实现了该接口的 bean 是具有被 Spring 容器通知的能力,通知的方式是采用回调的方式。 Aware 接口是一个空接口,实际的方法签名由各个子接口来确定,且该接口通常只会有一个接收单参数的 set 方法,该 set 方法的命名方式为 set + 去掉接口名中的 Aware 后缀,即 XxxAware 接口,则方法定义为 setXxx(),例如 BeanNameAware(setBeanName),ApplicationContextAware(setApplicationContext)。 Aware 的子接口需要提供一个 setXxx 方法,我们知道 set 是设置属性值的方法,即 Aware 类接口的 setXxx 方法其实就是设置 xxx 属性值的。 Aware 的含义是感知的、感应的,那么在 Spring 容器中是如何实现感知并设置属性值得呢?我们可以从初始化 bean 中的激活 Aware 的方法 invokeAwareMethods() 中看到一点点,如下:首先判断 bean 实例是否属于 Aware 接口的范畴,如果是的话,则调用实例的 setXxx() 方法给实例设置 xxx 属性值,在 invokeAwareMethods() 方法主要是设置 beanName,beanClassLoader、BeanFactory 中三个属性值。 Spring 提供了一系列的 Aware 接口,如下图(部分):上面只是一部分子类,从这里我们可以看到 Spring 提供的 Aware 接口是是何其多。同时从上图我们也看到了几个比较熟悉的接口,如 BeanClassLoaderAware、BeanFactoryAware、BeanNameAware,下面就这三个接口来做一个简单的演示,先看各自的定义: public interface BeanClassLoaderAwareextendsAware{ /** * 将 BeanClassLoader 提供给 bean 实例回调 * 在 bean 属性填充之后、初始化回调之前回调, * 例如InitializingBean的InitializingBean.afterPropertiesSet()方法或自定义init方法 */ void setBeanClassLoader(ClassLoader classLoader); } public interface BeanFactoryAware extends Aware { /** * 将 BeanFactory 提供给 bean 实例回调 * 调用时机和 setBeanClassLoader 一样 */ void setBeanFactory(BeanFactory beanFactory) throws BeansException; } public interface BeanNameAware extends Aware { /** * 在创建此 bean 的 bean工厂中设置 beanName */ void setBeanName(String name); } public interface ApplicationContextAware extends Aware { /** * 设置此 bean 对象的 ApplicationContext,通常,该方法用于初始化对象 */ void setApplicationContext(ApplicationContext applicationContext) throws BeansException; } 下面简单演示下上面四个接口的使用方法: public class MyApplicationAware implements BeanNameAware , BeanFactoryAware , BeanClassLoaderAware , ApplicationContextAware { private String beanName ; private BeanFactory beanFactory ; private ClassLoader classLoader ; private ApplicationContext applicationContext ; @Override public void setBeanClassLoader ( ClassLoader classLoader ) { System . out . println ( "调用了 BeanClassLoaderAware 的 setBeanClassLoader 方法" ); this . classLoader = classLoader ; } @Override public void setBeanFactory ( BeanFactory beanFactory ) throws BeansException { System . out . println ( "调用了 BeanFactoryAware 的 setBeanFactory 方法" ); this . beanFactory = beanFactory ; } @Override public void setBeanName ( String name ) { System . out . println ( "调用了 BeanNameAware 的 setBeanName 方法" ); this . beanName = name ; } @Override public void setApplicationContext ( ApplicationContext applicationContext ) throws BeansException { System . out . println ( "调用了 ApplicationContextAware 的 setApplicationContext 方法" ); this . applicationContext = applicationContext ; } public void display (){ System . out . println ( "beanName:" + beanName ); System . out . println ( "是否为单例:" + beanFactory . isSingleton ( beanName )); System . out . println ( "系统环境为:" + applicationContext . getEnvironment ()); } } 测试方法如下: public static void main ( String [] args ) { ClassPathResource resource = new ClassPathResource ( "spring.xml" ); DefaultListableBeanFactory factory = new DefaultListableBeanFactory (); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader ( factory ); reader . loadBeanDefinitions ( resource ); MyApplicationAware applicationAware = ( MyApplicationAware ) factory . getBean ( "myApplicationAware" ); applicationAware . display (); } 运行结果:从该运行结果可以看出,这里只执行了三个 Aware 接口的 set 方法,原因就是痛 getBean() 调用时在激活 Aware 接口时只检测了 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 三个 Aware 接口。如果将测试方法调整为下面: public static void main ( String [] args ) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "spring.xml" ); MyApplicationAware applicationAware = ( MyApplicationAware ) applicationContext . getBean ( "myApplicationAware" ); applicationAware . display (); } 则运行结果如下:从这了我们基本上就可以 Aware 真正的含义是什么了?感知,其实是 Spring 容器在初始化主动检测当前 bean 是否实现了 Aware 接口,如果实现了则回调其 set 方法将相应的参数设置给该 bean ,这个时候该 bean 就从 Spring 容器中取得相应的资源。最后文章末尾列出部分常用的 Aware 子接口,便于日后查询: LoadTimeWeaverAware:加载Spring Bean时织入第三方模块,如AspectJ BeanClassLoaderAware:加载Spring Bean的类加载器 BootstrapContextAware:资源适配器BootstrapContext,如JCA,CCI ResourceLoaderAware:底层访问资源的加载器 BeanFactoryAware:声明BeanFactory PortletConfigAware:PortletConfig PortletContextAware:PortletContext ServletConfigAware:ServletConfig ServletContextAware:ServletContext MessageSourceAware:国际化 ApplicationEventPublisherAware:应用事件 NotificationPublisherAware:JMX通知 BeanNameAware:声明Spring Bean的名字 原文发布时间为:2018-12-24本文作者:chenssy本文来自云栖社区合作伙伴“ Java技术驿站”,了解相关信息可以关注“chenssy89”微信公众号

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册