Spring框架注解里面@Scope啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架注解里面@Scope啥意思相关的知识,希望对你有一定的参考价值。

@Scope 简单点说就是用来指定bean的作用域(官方解释:scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象),其默认作用域是"singleton",如果要换成其他作用区域,直接后面添加类型即可,比如@Scope("prototype") ,注意spring2.0后 又增加了request ,session和global session 4个作用区域,希望对你有帮助。 参考技术A 如果你需要的bean实例是个单例,则定义@Scope("singleton"),如果是每次都new一个新的,则用@Scope("prototype")追问

那@Scope("request")怎么跟他写到一块去

参考技术B @Scope("prototype")表示每次都是个新实体,@Scope("singleton")表示单例,@Scope是作用范围追问

那@Scope("request")怎么跟他写到一块去

参考技术C @Scope 指定是否单例

需要单例就是singleto
不是prototype追问

那@Scope("request")怎么跟他写到一块去

追答

这个是用在web中的 表示只作用于一次请求

参考技术D

http://blog.csdn.net/chjttony/article/details/6286144

http://blog.csdn.net/jadyer/article/details/6038604

@Repository、 @Service、 @Controller @Component@Scope("prototype")  @PostConstruct  @PreDestroy@Required

<context:annotation-config />  <context:component-scan base-package=”bookstore.dao” /> 

Spring Annotation 的简单介绍

1.使用 @Repository、 @Service、 @Controller 和 @Component将类标识为 Bean:

Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。 @Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO 类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean 的自动扫描功能,这可以通过<context:component-scan/>

<context:component-scan base-package=”bookstore.dao” />   

<context:annotation-config/>

该配置隐式注册了多个对注解进行解析的处理器,如下列

AutowiredAnnotationBeanPostProcessor      CommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessor    RequiredAnnotationBeanPostProcessor

其实,注解本身做不了任何事情,和XML一样,只起到配置的作用,主要在于背后强大的处理器

如此,我们就不再需要在 XML 中显式使用 <bean/> 进行 Bean 的配置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有 class 文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。

Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解:

* @Component、@Service、@Constroller,它们分别用于软件系统的不同层次:

* @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。

* @Service 通常作用在业务层,但是目前该功能与 @Component 相同。

* @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。

通过在类上使用 @Repository、 @Component、 @Service 和 @Constroller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。

Spring使用注解的机制

当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean 名称。默认情况下,对于包含 name 属性的 @Component、 @Repository、 @Service 和 @Controller,会把name 取值作为 Bean 的名字。

如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的类的简单名称。

与通过 XML 配置的 Spring Bean 一样,通过上述注解标识的 Bean,其默认作用域是"singleton",为了配合这四个注解,在标注 Bean 的同时能够指定 Bean 的作用域,Spring 2.5 引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了

@Scope("prototype") 

@Repository 

public class Demo …  

使用 @PostConstruct 和 @PreDestroy 指定生命周期回调方法:

Spring Bean 是受 Spring IoC 容器管理,由容器进行初始化和销毁的(prototype 类型由容器初始化之后便不受容器管理),通常我们不需要关注容器对 Bean 的初始化和销毁操作,由 Spring 经过构造函数或者工厂方法创建的 Bean 就是已经初始化完成并立即可用的。然而在某些情况下,可能需要我们手工做一些额外的初始化或者销毁操作,这通常是针对一些资源的获取和释放操作

第一种方式:

是实现 Spring 提供的两个接口:InitializingBean 和 DisposableBean。如果希望在 Bean 初始化完成之后执行一些自定义操作,则可以让 Bean 实现 InitializingBean 接口,该接口包含一个 afterPropertiesSet() 方法,容器在为该 Bean 设置了属性之后,将自动调用该方法;如果 Bean 实现了 DisposableBean 接口,则容器在销毁该 Bean 之前,将调用该接口的 destroy() 方法。这种方式的缺点是,让 Bean 类实现 Spring 提供的接口,增加了代码与 Spring 框架的耦合度,因此不推荐使用。

第二种方式是:

在 XML 文件中使用 <bean> 的 init-method 和 destroy-method 属性指定初始化之后和销毁之前的回调方法,代码无需实现任何接口。这两个属性的取值是相应 Bean 类中的初始化和销毁方法,方法名任意,但是方法不能有参数。

<bean id=”userService” class=”bookstore.service.UserService” 

init-method=”init” destroy-method=”destroy”> 

</bean> 

第三种方式:

Spring 2.5 在保留以上两种方式的基础上,提供了对 JSR-250 的支持。JSR-250 规范定义了两个用于指定声明周期方法的注解: @PostConstruct 和 @PreDestroy。这两个注解使用非常简单,只需分别将他们标注于初始化之后执行的回调方法或者销毁之前执行的回调方法上。

由于使用了注解,因此需要配置相应的 Bean 后处理器,亦即在 XML 中增加如下一行:

<context:annotation-config />   

使用 @Required 进行 Bean 的依赖检查:

依赖检查的作用是,判断给定 Bean 的相应 Setter 方法是否都在实例化的时候被调用了。而不是判断字段是否已经存在值了。Spring 进行依赖检查时,只会判断属性是否使用了 Setter 注入。如果某个属性没有使用 Setter 注入,即使是通过构造函数已经为该属性注入了值,Spring 仍然认为它没有执行注入,从而抛出异常。另外,Spring 只管是否通过 Setter 执行了注入,而对注入的值却没有任何要求,即使注入的 <null/>,Spring 也认为是执行了依赖注入。

@Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。

为了让 Spring 能够处理该注解,需要激活相应的 Bean 后处理器。要激活该后处理器,只需在 XML 中增加如下一行即可:<context:annotation-config/>   

当某个被标注了 @Required 的 Setter 方法没有被调用,则 Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。

使用 @Resource、 @Autowired 和 @Qualifier 指定 Bean 的自动装配策略

自动装配是指,Spring 在装配 Bean 的时候,根据指定的自动装配规则,将某个Bean所需要引用类型的Bean注入进来。

<bean> 元素提供了一个指定自动装配类型的 autowire 属性,该属性有如下选项:

* no -- 显式指定不使用自动装配。

* byName -- 如果存在一个和当前属性名字一致的 Bean,则使用该 Bean 进行注入。如果名称匹配但是类型不匹配,则抛出异常。如果没有匹配的类型,则什么也不做。

* byType -- 如果存在一个和当前属性类型一致的 Bean ( 相同类型或者子类型 ),则使用该 Bean 进行注入。byType 能够识别工厂方法,即能够识别 factory-method 的返回类型。如果存在多个类型一致的 Bean,则抛出异常。如果没有匹配的类型,则什么也不做。

* constructor -- 与 byType 类似,只不过它是针对构造函数注入而言的。如果当前没有与构造函数的参数类型匹配的 Bean,则抛出异常。使用该种装配模式时,优先匹配参数最多的构造函数。

* autodetect -- 根据 Bean 的自省机制决定采用 byType 还是 constructor 进行自动装配。如果 Bean 提供了默认的构造函数,则采用 byType;否则采用 constructor 进行自动装配。

使用 @Resource 和 @Qualifier 注解

如果希望根据 name 执行自动装配,那么应该使用 JSR-250 提供的 @Resource 注解

@Resource 使用 byName 的方式执行自动封装。 @Resource 标注可以作用于带一个参数的 Setter 方法、字段,以及带一个参数的普通方法上。 @Resource 注解有一个 name 属性,用于指定Bean在配置文件中对应的名字。如果没有指定 name 属性,那么默认值就是字段或者属性的名字。

如果 @Resource 没有指定 name 属性,那么使用 byName 匹配失败后,会退而使用 byType 继续匹配,如果再失败,则抛出异常。在没有为 @Resource 注解显式指定 name 属性的前提下,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。此时 name 属性不需要指定 ( 或者指定为""),否则注入失败;

参考资料

spring常用注解.博客[引用时间2017-12-27]

spring注解中@component是啥意思

@Component("userManager")
public class UserManagerImpl implements UserManager
private UserDao userDao ;
public UserDao getUserDao()
return userDao;

@Resource
public void setUserDao(UserDao userDao)
this.userDao = userDao;

/* (non-Javadoc)
* @see com.wjs.registration.service.UserManager#exists(com.wjs.registration.model.Users)
*/
public boolean exists(Users u)
return userDao.checkUserExistsWithName(u.getUsername());

/* (non-Javadoc)
* @see com.wjs.registration.service.UserManager#add(com.wjs.registration.model.Users)
*/
public void add(Users u)
userDao.save(u);


这里表示什么意思哦@Component("userManager")

spring注解中@component就是说把这个类交给Spring管理,又一次起个名字叫userManager,因为不清楚这个类是属于哪个层面,所以就用@Component。

因为在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视。

扩展资料:

注解@component的原理

1、注解@Resource原理

1)启动spring容器,并且加载配置文件;

2)会为student和person两个类创建对象;

3)当解析到<context:annotation-config></context:annotation-config>会启动依赖注入的注解解析器;

4)会在纳入spring管理的bean的范围内查找看哪些bean属性上有@Resource注解;

(1)如果@Resource注解的name属性的值为"",则会把注解所在的属性的名称和spring容器中的bean的id进行匹配,若匹配成功,则把id对应的对象赋值给该属性;若匹配不成功,则按照类型进行匹配;若再匹配不成功,则报错;

(2)如果@Resource注解的name属性的值不为"",会把name的属性值和spring容器中的bean的id做匹配,如果匹配成功,则赋值;否则,直接报错。

说明:注解只能用于引用类型。

以@Resource注解(spring扩展包)和@Autowired@Qualifier功能作用相同

参考技术A

因为在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视。

spring注解中@component就是说把这个类交给Spring管理,又一次起个名字叫userManager,因为不清楚这个类是属于哪个层面,所以就用@Component。

spring注解的作用:

1、spring作用在类上的注解有@Component、@Responsity、@Service以及@Controller;而@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。

2、当注解作用在类上时,表明这些类是交给spring容器进行管理的,而当使用@Autowired和@Resource时,表明我需要某个属性、方法或字段,但是并不需要我自己去new一个,只需要使用注解, spring容器会自动的将我需要的属性、方法或对象创造出来。这就是通常所说的依赖注入和控制反转。

参考技术B 在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释

这里就是说把这个类交给Spring管理,重新起个名字叫userManager,由于不好说这个类属于哪个层面,就用@Component本回答被提问者采纳
参考技术C @Component("userManager")
注册容器bean ,名字是 userManager
参考技术D “因为在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视。 spring注解中@component就是说把这个类交给Spring管理,又一次起个名字叫user...”

以上是关于Spring框架注解里面@Scope啥意思的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 注解@Valid 啥意思

spring框架配置文件中的这三个语句是啥意思?

spring注解中@component是啥意思

springsource是啥

spring属于哪个层次?主要解决啥问题?

二Java框架之Spring注解开发