一、ApplicationContext
1.ApplicationContext的结构体系
ApplicationContext接口是一个BeanFactory基础上封装了更多功能的,Spring中最为常用的IoC容器,其包含两个子接口:ConfigurableApplicationContext、WebApplicationContext。
首先来理解一下相关的概念:容器是spring的核心,使IoC管理所有和组件,spring有两种容器:a、BeanFactoy;b、ApplicationContext应用上下文。其中BeanhFactory使用延迟加载所有的Bean,为了从BeanhFactory得到一个Bean,只要调用getBean()方法,就能获得Bean。而ApplicationContext:
a、提供文本信息解析,支持I18N。(我们公司采用这个方式进行文本解析。)
b、提供载入文件资源的通用方法。
c、向注册为监听器的Bean发送事件。
d、ApplicationContext接口扩展BeanFactory接口。
e、ApplicationContext提供附加功能。
ApplicationContext的三个实现类:
a、ClassPathXmlApplication:把上下文文件当成类路径资源
b、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息。
c、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。
2.两者之间的区别:
Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。二者对Bean的初始化也有很大区别。BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。ApplicationContext会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而BeanFactory需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。
作用:
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
二、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:注解在类上;为类提供一个无参的构造方法。