1、ApplicationContextjava
1.ApplicationContext的结构体系spring
ApplicationContext接口是一个BeanFactory基础上封装了更多功能的,Spring中最为经常使用的IoC容器,其包含两个子接口:ConfigurableApplicationContext、WebApplicationContext。json
首先来理解一下相关的概念:容器是spring的核心,使IoC管理全部和组件,spring有两种容器:a、BeanFactoy;b、ApplicationContext应用上下文。其中BeanhFactory使用延迟加载全部的Bean,为了从BeanhFactory获得一个Bean,只要调用getBean()方法,就能得到Bean。而ApplicationContext:restful
a、提供文本信息解析,支持I18N。(咱们公司采用这个方式进行文本解析。)
b、提供载入文件资源的通用方法。
c、向注册为监听器的Bean发送事件。
d、ApplicationContext接口扩展BeanFactory接口。
e、ApplicationContext提供附加功能。app
ApplicationContext的三个实现类:框架
a、ClassPathXmlApplication:把上下文文件当成类路径资源
b、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息。异步
c、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。ui
2.二者之间的区别:spa
Spring提供了两种不一样的容器:一种是最基本的BeanFactory,另外一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。两者对Bean的初始化也有很大区别。BeanFactory当须要调用时读取配置信息,生成某个类的实例。若是读入的Bean配置正确,则其余的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,若是配置文件没有错误,就建立全部的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 惟一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。ApplicationContext会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而BeanFactory须要在代码中经过手工调用addBeanPostProcessor()方法进行注册。.net
做用:
1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,还提供了更完整的框架功能:
a. 国际化支持。
b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件传递:经过实现ApplicationContextAware接口。
3.获取bean的方式
方法一:在初始化时保存ApplicationContext对象 。
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("userService");/
方法二:经过Spring提供的utils类获取ApplicationContext对象 。
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");
方法三:继承自抽象类ApplicationObjectSupport 。
方法四:继承自抽象类WebApplicationObjectSupport 。
方法五:实现接口ApplicationContextAware 。(现阶段所作项目采用了此方法)
public class SpringContextUtil implements ApplicationContextAware { // Spring应用上下文环境 private static ApplicationContext applicationContext; /** * 实现ApplicationContextAware接口的回调方法。设置上下文环境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 获取对象 * * @param name * @return Object * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
注意:尽管,spring提供的后三种方法可以实现在普通的类中继承或实现对应的类或接口来获取spring 的ApplicationContext对象,但是在使用是必定要注意实现了这些类或接口的普通java类必定要在Spring 的配置文件applicationContext.xml文件里进行配置。不然获取的ApplicationContext对象将为null。也就是SpringContextUtil 要配置在xml中。
方法六:经过Spring提供的ContextLoader。
资料:http://blog.csdn.net/u011202334/article/details/51509235
2、spring中的经常使用注解。
@Configuration:把一个类做为一个IoC容器,它的某个方法头上若是注册了@Bean,就会做为这个Spring容器中的Bean。
@Lazy(true) :表示延迟初始化。
@Service:用于标注业务层组件。 (使用不少)
@Controller:用于标注控制层组件(如struts中的action)。(使用不少)
@Repository:用于标注数据访问组件,即DAO组件。(使用不少)
@Component:泛指组件,当组件很差归类的时候,咱们可使用这个注解进行标注。
@Scope:注解 做用域。(通常使用默认)
@PostConstruct:用于指定初始化方法(用在方法上)。(使用不少)
@PreDestory:用于指定销毁方法(用在方法上)。
@DependsOn:定义Bean初始化及销毁时的顺序。(使用不少,做用在类上)
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将做为首选者,不然将抛出异常。
@Autowired: 默认按类型装配,若是咱们想使用按名称装配,能够结合@Qualifier注解一块儿使用。以下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用。(使用不少)
@Async:异步方法,方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成。
@PathVariable :@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可经过 @Pathvariable注解绑定它传过来的值到方法的参数上。(使用不少,restful风格上)
@RequestParam(required = true):能够设置默认参数。(使用不少)
@RequestMapping(value="/",produces=""):设置URL,能够带不少参数;method: 指定请求的method类型, GET、POST、PUT、DELETE等;produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;例如,方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。(使用不少)
@ResponseBody:转为json。(使用不少)
Spring 4.2新特性:
@Data:注解在类上;提供类全部属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法。