1、spring的核心
Spring的核心是spring容器,spring容器提供了对bean的创建、管理、销毁等。Spring框架很大程度上继承和延续了servlet的思想。
2、Bean的详解
2.1、Bean是什么?
Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
凡是有方法或属性的类都需要实例化,实例化之后才能去使用这些方法和属性;
Spring中,凡是子类及带有方法或属性的类都要加上@Bean注册到spring容器中,通过spring容器去管理。
把Bean理解为类的代理或代言人(是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了(类的名字、属性、方法)
2.2、Bean的分类
1、一类是使用Bean,即是把spring3中已经在XML文件中配置好的Bean拿来用,在spring4中是依赖注解去装配,一个带有@configuration的类就是一个配置类,在配置类里使用@Bean完成属性、方法的组装;@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean。这种bean的默认名字是方法的名字,也可以通过@Bean(name = “xxx”)去指定名字。这种bean可以进行初始化和销毁设置。
默认为单例,使用了@Scope(“prototype”)将会是非单例的。
2、注册bean,即带有@Component@controller@service@Repository这些的注解。@Component这4个注解注入时,无法指定初始化和销毁方法。表明是个组件,默认的名字是类名,也可以自己定。如@Component(“name”),component没有明确角色的时候使用。@Controller一般用在展现层。@Repository一般用在数据访问层上面。@Service用在业务逻辑层。
2.3、Bean的获取
Bean的获取有2种方法,一种通过名字,一种通过类型。
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(MyConfig.class);
System.out.println(context.getBean(MyBean.class));
System.out.println(context.getBean(”MyBean”));
AnnotationConfigApplicationContext 可以实现基于Java的配置类加载Spring的应用上下文,相比较于application.xml更加简洁高效。注意两者写法的区别。
2.4、Bean的三种初始化和销毁方法
1、实现spring指定的接口。通过注入Factory工厂装配Bean,初始化在装配完执行
public class Cat implements InitializingBean, DisposableBean {
public void afterPropertiesSet() throws Exception {
System.out.println("=afterPropertiesSet=");
}
@Override
public void destroy() throws Exception {
System.out.println("=destroy===");
}
}
2、装配bean时指定初始化和销毁方法(依赖性最低,但有局限性)
@Bean(initMethod=”init”,destoryMethod=”destory”)
public Dog createDog(){
return new Dog();
}
public class Dog {
public void init(){
System.out.println("=init=");
}
public void destroy(){
System.out.println("=destroy=");
}
}
3、采用注解的方式
public class Animal {
@PostConstruct
public void initial(){
System.out.println("--------initial-------");
}
@PreDestroy
public void close(){
System.out.println("--------close---------");
}
}
2.5、Bean的装配
1、通过通过RunnableFactoryBean装配Bean
RunnableFactoryBean是一个特殊的bean,用来创建别的bean,本例中是jeep。它实现了FactoryBean的三个方法:getObject()获取创建的实例对象;getObjectType()获取创建对象的类型(包装类);isSingleton:设置是否单例。
public class RunnableFactoryBean implements FactoryBean {
public Jeep getObject() throws Exception {
return new Jeep();
}
public Class<?> getObjectType() {
return Jeep.class;
}
public boolean isSingleton() {
return false;
}
}
装配bean:
@Bean
public RunnableFactoryBean createRunnableFactoryBean(){
return new RunnableFactoryBean();
}
2、通过注入Factory工厂装配Bean
先向spring容器中注入factory作为参数,等注入car时从spring容器中获取参数CarFactory注入。
@Bean
public CarFactory createJeepFactory(){
return new CarFactory();
}
@Bean
public Car createCar(CarFactory factory){
return factory.create();
}
public class CarFactory {
public Car create(){
return new Car();
}
}
2.6、Bean的作用域
Bean的作用域用于确定spring创建Bean的实例个数。
(1)singleton(单例),在spring容器中仅存在一个Bean实例,Bean以单例方式存在,默认值。
(2)Prototype,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行XxxBean()。
(3)Request,每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境。
(4)Session,同一个HTTP session共享一个Bean,不同的session适用不同的bean,仅适用于WebApplicationContext环境。
(5)globalSession,一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境。