spring基础(三)

1:spring作用域范围scope:

  Scope描述的是Spring容器如何新建Bean实例的。Spring的Scope有以下几种,通过@Scope注解来实现。
  (1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。
  (2)Prototype:每次调用新建一个Bean实例。
  (3)Request:Web项目中,给每一个 http request 新建一个Bean实例。
  (4)Session:Web项目中,给每一个 http session 新建一个Bean实例。
  (5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

@Configuration
public class ScopeTest {
    
    @Bean
    @Scope(value="singleton")
    public Config singeConfig() {
        return new Config();
    }
    
    @Bean
    @Scope(value="prototype")
    public Config prototypeConfig() {
        return new Config();
    }
    
    
    @Bean
    @Scope(value="request")
    public Config requestConfig() {
        return new Config();
    }
    
    @Bean
    @Scope(value="session")
    public Config sessionConfig() {
        return new Config();
    }
}

 

2:FactoryBean实例化对象

  参考文档:https://www.cnblogs.com/redcool/p/6413461.html

package com.test.zhang;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;


@Component
public class MyFactoryBean implements FactoryBean<UserTest>{

    @Override
    public UserTest getObject() throws Exception {
        return new UserTest(11);
    }

    @Override
    public Class<?> getObjectType() {
        return UserTest.class;
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return true;
    }

    

}

 

3:spring4.3构造方法注入对象新特性

/**
 * spring4.3新特性
 * 需要注意:
 * 1:构造函数只能有一个,如果有多个的话,就必须有一个无参的构造函数,此时,spring会调用无参的构造函数
 * 2:构造函数的参数,必须都要在Spring容器中有
 * @author hadoop
 *
 */
@Component
public class Spring4_3 {
    
    private ApplicationContext applicationContext;
    private TestInitAndDestory testInitAndDestory;

    public Spring4_3(ApplicationContext applicationContext,TestInitAndDestory testInitAndDestory) {
        this.applicationContext = applicationContext;
        this.testInitAndDestory = testInitAndDestory;
    }
    
    public void show() {
        System.out.println(applicationContext );
        this.testInitAndDestory.add();
    }
}

 

4:ApplicationContextAware接口拿到spring上下文

参考文档:https://blog.csdn.net/bailinbbc/article/details/76446594

package com.edu.spring1;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 实现逻辑参照:ApplicationContextAwareProcessor
 * @author hadoop
 *
 */
@Component
public class Book implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    
    public void show(){
        System.out.println("book : " + applicationContext.getClass());
    }
}

5:BeanPostProcessor

 参考文档:https://www.cnblogs.com/libra0920/p/6118157.html

package com.test.zhang;

import java.lang.reflect.Proxy;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;


@Component
public class MyBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

}

 

6:BeanDefinitionRegistryPostProcessor 动态注册bean

package com.edu.spring2;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;

/**
 * BeanDefinitionRegistryPostProcessor可以拿到ConfigurableListableBeanFactory,BeanDefinitionRegistry两个对象
 * BeanDefinitionRegistry对象可以动态的注入bean
 * @author hadoop
 *
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        
    }

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        for(int i=1;i<=10;i++){
            BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(Person.class);
            bdb.addPropertyValue("name", "admin" + i);
            registry.registerBeanDefinition("person" + i, bdb.getBeanDefinition());
        }
    }

}

 

posted on 2018-04-14 19:49  tarimengyan  阅读(116)  评论(0)    收藏  举报

导航