Spring Bean的几种注册获取方式

1.  Spring标签

 @Repository:持久层,用于标注数据访问组件,即DAO组件。

@Service:业务层,用于标注业务逻辑层主键。

@Controller:控制层,标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.

@Component:当你不确定是属于哪一层的时候使用。

@RestController    :Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。

@Autowired:用来装配bean,都可以写在字段上,或者方法上。默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false

@RequestMapping

类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。

方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。

2. 非注解Spring

配置beans.xml

```

   

```

获取bean:

```

applicationContext = new ClassPathApplicationContext(XmlPath);

applicationContext.getBean(id);

```

3. 注解

1. 创建注解配置类

注解标签用@Configuration,告诉Spring容器这是一个配置类

2.  注册组件(配置类中)

可以创建一个返回值为所需组件类的方法,在方法中直接返回一个组件对象。并且用标签@Bean注解,目的是告诉Spring容器注册一个Bean;

bean默认id为方法名

在Spring容器启动时,容器就会自动调用@Bean标签注解的方法,创建一个组件对象,默认id为方法名,与非注解方式是一致的。

```

@Configuration

public class MainConfig {

@Bean

public User getUser() { return new User("zhansan",15); }

}

```

3.  获取Bean

```

ApplicationContext ac = new AnnotationConfigApplicationContext(配置类);

ac.getBean(组件类);(例如Person.class)

```

这是获取到的就是在config类中注册的bean

可以用ac.getBeanNameForType()组件bean类的id

```

public static void main(String[] args) {

ApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig.class);

    User user = applicationContext.getBean(User.class);

    System.out.println(user.toString());

}

```

4. 包扫描方式

非注解方式:在bean.xml中配置

只要标注了@Controller、@Service、@Component、@Repository都会被自动扫描,然后加入Spring容器中

注解方式:在配置类中,类声明之前,添加注解标签@ComponentScan(value = "想要扫描的包名")

在标签中也可以设置只包含或者不包含那些类。

在配置完包扫描之后,可以写一个test类测试一下:

用方法ac.getBeanDefinationNames();获取容器中所有bean的names,答应出来就可以看到容器中的所有bean的name

其实@Controller、@Service、@Component、@Repository标签标注的类都是Component

```

@org.junit.Test

public void test01(){

ApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig.class);

    String[] names = applicationContext.getBeanDefinitionNames();

    for(String s : names)

{

System.out.println(s);

    }

}

```

5. 单实例和多实例

单实例singleton:在创建容器之后就会自动调用方法,创建对象并放在容器中。以后每次获取组件都是在容器中拿,是同一个对象


产生组件对象


测试代码
创建容器,自动调用方法产生对象

多实例prototype:再创建容器之后并不会直接调用方法创建对象,而是创建之后要获取对象时,才调用方法产生对象。

6. 懒加载(针对单实例·)

对单实例bean来说,默认在容器时创建对象

但是懒汉模式,在启动时并不创建对象,在第一次获取bean对象时创建对象

7. @Cnditional

此标签可以标注类,也可以标注方法;可以控制组件在特定条件下,导入不同的bean

需要:在condition类中实现Conditional接口,并且重写boolean matches方法。

使用:在标注@Cnditional时候,要给出相应的condition类。即在什么条件成立时,产生什么bean对象。

8. import快速导入组件

(1) 只需要在配置类声明之上添加标签@Import(要添加的bean的类名.class)

导入多个:@Import({要添加的bean的类名.class, 另一组件类名.class.....})

id默认是组件在项目中的路径全类名。

(2) ImportSelector

使用:Selector类要实现ImportSelector接口,重写selectImports方法,返回一个String数组,就是要导入的bean的全类名;然后在@Import(要添加的bean的类名.class)标签中,加入selector类.class.

这样就可以导入所需要的bean对象了


(3) ImportBean

使用:实现ImportBeanDefinitionRegistrar接口,并且重写void registerBeanDefinitions方法;与selector相似,类.class也要加进import标签中。



(4) FactoryBea工厂bean

继承FactoryBean接口

添加要实现的方法

你可能感兴趣的:(Spring Bean的几种注册获取方式)