spring IoC @Bean注解

介绍

应用场景

一般用于让spring容器管理 第三方的类对象 。因为第三方类一般在jar包中,无法在这些类上,添加 @Controller、@Service、@Repository、@Component 注解,此时就可以用 @Bean 注解

较少用于创建 本工程的类对象,因为本工程的类对象上,可以用 @Controller、@Service、@Repository、@Component 注解

使用方法

一般用在 配置类 中,修饰 方法,该方法 返回一个bean对象

作用

@Bean注解相当于传统application-config.xml配置文件中的<bean>标签

把方法的 返回值(Bean对象),放入到Spring IOC容器中

默认为单例模式,修改作用域需要搭配 @Scope 注解

属性

  • name:指定该bean对象在spring容器中的id,相当于 <bean id="">标签的 id 属性。
    如果不指定,默认为 该方法的名称
    其类型是 String[] ,所以支持多个id

例子

本例为了易于理解、实现简单,所以 用于创建本工程的类对象

UserSrvImpl

public class UserSrvImpl implements IUserService {

    public UserSrvImpl(){
        System.out.println("UserSrvImpl构造方法");
    }
    public void save(String username,String password){
        System.out.println("UserSrvImpl保存 "+username+"-"+password);
    }
}

ApplicationConfig

@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {

    @Bean
    public UserSrvImpl getUserSrvImpl(){
        return new UserSrvImpl();
    }
}

这里使用 @Bean 注解,由于没有指定 name 属性,那么spring容器中的id是方法名: getUserSrvImpl

相当于xml配置文件:

<beans>
    <bean id="getUserSrvImpl" class="top.malaoshi.UserSrvImpl"/>
</beans>

执行

public class Main {
    public static void main(String[] args) {
        ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);

        IUserService srv=(IUserService)ac.getBean("getUserSrvImpl");
        IUserService srv2=(IUserService)ac.getBean("getUserSrvImpl");
        System.out.println(srv);
        System.out.println(srv2);
        System.out.println(srv==srv2);
    }
}

执行结果:

UserSrvImpl构造方法
top.malaoshi.UserSrvImpl@e677af
top.malaoshi.UserSrvImpl@e677af
true

两个对象的内存地址是相同的,说明是单例模式

自定义bean的命名

默认情况下bean的名称和方法名称相同,你也可以使用name属性来指定

ApplicationConfig

@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {

    @Bean(name="user")
    public UserSrvImpl getUserSrvImpl(){
        return new UserSrvImpl();
    }
}

主启动类

public class Main {
    public static void main(String[] args) {
        ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);

        IUserService srv=(IUserService)ac.getBean("user");
        IUserService srv2=(IUserService)ac.getBean("user");
        System.out.println(srv);
        System.out.println(srv2);
        System.out.println(srv==srv2);
    }
}

支持多个名

@Bean(name = { "userSrvImpl", "userSrvImpl2" })


原文出处:/show_1EF5gry55aKL.html