4.114 Spring的bean和注解
-
Spring的Bean
-
Spring Bean是什么
-
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
-
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
-
如何给Spring 容器提供配置元数据
-
XML配置文件。
-
Set方法注入;
-
构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
-
静态工厂注入;
-
实例工厂
-
基于注解的配置。
-
@Component 指定把一个对象加入IOC容器
-
@Repository 作用同@Component; 在DAO持久层使用
-
@Service 作用同@Component; 在IMPL业务逻辑层使用
-
@Controller 作用同@Component; 在控制层使用
-
@Resource 属性注入
-
基于java的配置。
-
总结
-
使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI)
-
注解可以和XML配置一起使用。
-
-
SpringBean的作用域
-
当定义一个 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。
-
singleton : bean在每个Spring ioc 容器中只有一个实例。
-
prototype:一个bean的定义可以有多个实例。
-
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
-
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
-
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
-
注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。
-
-
-
Spring的注解
-
什么是基于Java的Spring注解配置? 给一些注解的例子
-
基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。
-
以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。
-
另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
-
怎样开启注解装配?
-
先引入context名称空间: xmlns:context="http://www.springframework.org/schema/context"
-
开启注解扫描 <context:component-scan base-package="com.itmayiedu02"></context:component-scan>
-
通过注解的方式,把对象加入ioc容器
-
@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
-
@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
-
@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
-
@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
-
@Required 注解有什么作用:
-
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。
-
@Autowired 注解有什么作用
-
:@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
-
Autowired和@Resource之间的区别
-
@Autowired可用于:构造函数、成员变量、Setter方法
-
@Autowired和@Resource之间的区别
-
@Autowired默认是按照类型装配注入的(这个注解是属业spring的),默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
-
@Autowired() @Qualifier("baseDao")
-
private BaseDao baseDao;
-
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
-
@Resource(name="baseDao")
-
总结:可以多使用@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅
-
@Qualifier 注解有什么作用:
-
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。
-
@RequestMapping 注解
-
用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
-
类级别:映射请求的 URL
-
方法级别:映射 URL 以及 HTTP 请求方法
-
努力不一定成功,但不努力一定会失败~