Spring
一、Spring简介
spring体系
模块名称 功能特点 Spring Core Spring核心,它是框架最基础的部分,提供IOC和依赖注入特性 Spring Context Spring上下文容器,它是BeanFactory功能加强的一个子接口 Spring Web 它提供Web应用开发的支持 Spring MVC 它针对Web应用中MVC思想的实现 Spring DAO 提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性。 Spring ORM 它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等等。 Spring AOP AOP即,面向切面编程,它提供了与AOP联盟兼容的编程实现
二、配置文件声明bean
2.1 配置文件
<?xml version="1.0" encoding="UTF-8"?>
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation= " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" >
< bean id = " person" class = " com.enjoy.cap1.Person" >
< property name = " name" value = " james" > </ property>
< property name = " age" value = " 19" > </ property>
</ bean>
</ beans>
2.2 代码
public class MainTest1 {
public static void main ( String args[ ] ) {
ApplicationContext app = new ClassPathXmlApplicationContext ( "beans.xml" ) ;
Person person = ( Person) app. getBean ( "person" ) ;
System. out. println ( person) ;
}
}
三、Configuration注解
声明该注解的是配置类,等价于配置文件声明bean,代码如下:
@Configuration
public class MainConfig {
@Bean ( "beanName" )
public Person person ( ) {
return new Person ( "james" , 20 ) ;
}
}
3.1 代码
public class MainTest2 {
public static void main ( String args[ ] ) {
ApplicationContext app = new AnnotationConfigApplicationContext ( MainConfig. class ) ;
Person person = ( Person) app. getBean ( "beanName" ) ;
System. out. println ( person) ;
String[ ] namesForBean = app. getBeanNamesForType ( Person. class ) ;
for ( String name: namesForBean) {
System. out. println ( name) ;
}
}
}
四、ComponentScan
4.1 ComponentScan扫描路径,指定bean扫描范围
@Configuration
@ComponentScan ( value= "com.enjoy.cap2" )
public class Cap2MainConfig {
@Bean
public Person person01 ( ) {
return new Person ( "james" , 20 ) ;
}
}
4.2 扫描过滤器
@Configuration
@ComponentScan ( value= "com.enjoy.cap2" , includeFilters= {
@Filter ( type= FilterType. ANNOTATION, classes= { Controller. class } )
} , useDefaultFilters= false )
public class Cap2MainConfig {
}
4.3 自定义过滤规则
@Configuration
@ComponentScan ( value= "com.enjoy.cap2" , includeFilters= {
@Filter ( type= FilterType. CUSTOM, classes= { JamesTypeFilter. class } )
} , useDefaultFilters= false )
public class Cap2MainConfig {
}
JamesTypeFilter是自定义的过滤规则,实现TypeFilter接口
五、scope
5.1 scope指定bean的作用范围
@Configuration
public class Cap3MainConfig {
@Scope ( "prototype" )
@Bean
public Person person ( ) {
return new Person ( "james" , 20 ) ;
}
}
六、Lazy延迟加载
@Configuration
public class Cap4MainConfig {
@Lazy
@Bean
public Person person ( ) {
System. out. println ( "给容器中添加person......." ) ;
return new Person ( "james" , 20 ) ;
}
}
七、Conditional
Conditional按照条件注册bean
@Conditional ( MyCondition. class )
@Bean
public MyBean myBean ( ) {
return new MyBean ( ) ;
}
public class MyCondition implements Condition {
if ( xxx) {
return false ;
}
return true ;
}
八、Import
/**
* @Import(A.class)
*/
九、注册bean的方法小结
注册bean的方法 备注 包扫描+注解标注 指定包扫描路径,路径下的类使用@Componount或者相关注解标注 @Bean 导入第三方类或者包的组件(相对比较简单) @Import Import的参数可以是一个类,也可以是一个ImportSelector接口,也可以是ImportBeanDefinitionRegistrar接口 实现FactoryBean接口 getObject返回bean对象
代码
下面代码涵盖了多种bean的创建方式,包括@Bean注解,@Import,MyImportSelector,MyImportBeanDefinitionRegistrar,FactoryBean
@Configuration
@Import ( value = { Dog. class , Cat. class , MyImportSelector. class , MyImportBeanDefinitionRegistrar. class } )
public class Cap6MainConfig {
@Bean ( "person" )
public Person person ( ) {
return new Person ( "kobe" , 20 ) ;
}
@Bean
public MyFactoryBean myFactoryBean ( ) {
return new MyFactoryBean ( ) ;
}
}
public class Dog {
}
public class Cat {
}
public class MyImportSelector implements ImportSelector {
@Override
public String[ ] selectImports ( AnnotationMetadata importingClassMetadata) {
return new String [ ] { "com.intellif.ch6.bean.Fish" , "com.intellif.ch6.bean.Tiger" } ;
}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions ( AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean bean1 = registry. containsBeanDefinition ( "com.intellif.ch6.bean.Dog" ) ;
boolean bean2 = registry. containsBeanDefinition ( "com.intellif.ch6.bean.Cat" ) ;
if ( bean1 && bean2) {
RootBeanDefinition beanDefinition = new RootBeanDefinition ( Pig. class ) ;
registry. registerBeanDefinition ( "pig" , beanDefinition) ;
}
}
}
public class MyFactoryBean implements FactoryBean < Monkey> {
@Override
public Monkey getObject ( ) throws Exception {
return new Monkey ( ) ;
}
@Override
public Class< ? > getObjectType ( ) {
return Monkey. class ;
}
@Override
public boolean isSingleton ( ) {
return true ;
}
}
测试代码:
public class Ch6Test {
@Test
public void test01 ( ) {
ApplicationContext app = new AnnotationConfigApplicationContext ( Cap6MainConfig. class ) ;
System. out. println ( "------cut-off---------" ) ;
String[ ] names = app. getBeanDefinitionNames ( ) ;
for ( String name : names) {
System. out. println ( name+ "---" + app. getBean ( name) ) ;
}
}
}
注意在使用FactoryBean的方式注册bean的时候,bean的名字是下面这个方法的名字,但是对应bean的类型是MyFactoryBean
的getObject方法返回的类型
@Bean
public MyFactoryBean myFactoryBean ( ) {
return new MyFactoryBean ( ) ;
}