什么是spring中的Bean

当初在开发JAVA语言的时候,就是不知道该取什么名字。后来,在程序员中,他们经常喝一种咖啡, 叫“爪洼”(音译),就取名为JAVA。这种咖啡,是用“爪洼豆”磨出来的。所以,他们给用“豆”来命名。就是Bean。

Bean是Java中基本的代码重用单位,是遵守一定约定的Java类。在Spring中,Bean就是普通的Java类,由Spring IoC容器实例化、组装、管理。

Bean的作用域

单例(singleton):默认作用域,一个Spring容器中只有Bean的一个实例;

原型(prototype):每次获取Bean时生成一个新的实例;

请求(request):作用域是单个HTTP请求,单个HTTP请求只有Bean的一个实例,一旦请求完成,Bean实例将被销毁;

会话(session):作用域是单个会话,单个会话只有Bean的一个实例,一旦会话结束,Bean实例将被销毁;

全局会话(global-session):在Portlet应用程序中使用,每个全局对话只有Bean的一个实例。普通Servlet应用中与会话作用域无区别。

Bean的生命周期

创建bean实例—>设置bean的属性值—>调用初始化回调方法—>使用Bean—>调用销毁回调方法—>销毁Bean。

IOC容器装配Bean对象的三种配置方式

使用XML文件来配置

①Bean定义。在XML文件中通过元素定义Bean。如<bean class=”com.bbt.UserDao”/>

②Bean名称。通过<bean>的id或name属性定义。如,

③Bean注入。通过<property>子元素注入

④Bean生命过程

⑤Bean作用范围

⑥Bean延迟初始化

基于注解配置(常用)

①Bean定义。Spring的注解扫描默认是不开启的,所以我们还需要@ComponentScan注解或XML(applicationContext.xml)的方式启动。启动后在Bean实现类处通过标注@Component或衍型类(@Repository【dao层】、@Service【service层】、@Controller【controller层】)定义Bean。

②Bean名称。通过注解的value属性定义,如@Component(“userDao”)。默认名称为小写字母打头的类名。

③Bean注入。通过构造函数注入,属性的Setter注入,或字段注入三种方式上标注@Autowired按类型匹配自动注入。(@Autowired先按照类型去找,再按照名字,结合@Qualifier();@resource先按照名字去找)

④Bean生命过程

⑤Bean作用范围

⑥Bean延迟初始化

@Component
public class Dog {
    @Value("旺财")
    private String name;
    @Value("黑色")
    private String color;

基于java类配置

①Bean定义。Spring的注解扫描默认是不开启的,所以我们还需要@ComponentScan注解或XML(applicationContext.xml)的方式启动。启动后在标注了@Configuration的java类中,通过在类方法上标注@Bean定义一个bean。

②Bean名称。通过@Bean的name属性定义,如@Bean(“userDao”),默认名称为方法名。

③Bean注入。比较灵活,可以通过在方法处通过@Autowired使方法入参绑定Bean,然后在方法中通过代码进行注入,还可以通过调用配置类的@Bean方法进行注入。

④Bean生命过程

⑤Bean作用范围

⑥Bean延迟初始化

public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext("MyConfiguration.class");
    Person p=(Person)  context.getBean("person1");
    System.out.println(p);
}

//创建配置类,启动注解扫描
@Configuration
@ComponentScan
public class MyConfiguration {

    @Bean("person1")//定义Bean,设置Bean名称
    @Scope("prototype")//管理生命周期,设为原型
    public Person getPerson1() {
        return new Person("张三丰", "23");
    }
}