本文共 3111 字,大约阅读时间需要 10 分钟。
Spring的核心是spring容器,spring容器提供了对bean的创建、管理、销毁等。Spring框架很大程度上继承和延续了servlet的思想。
Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
凡是有方法或属性的类都需要实例化,实例化之后才能去使用这些方法和属性; Spring中,凡是子类及带有方法或属性的类都要加上@Bean注册到spring容器中,通过spring容器去管理。 把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用在业务逻辑层。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更加简洁高效。注意两者写法的区别。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---------"); } }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(); } }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环境。转载地址:http://flrai.baihongyu.com/