百度
360搜索
搜狗搜索

component注解,注解service和component的区别详细介绍

本文目录一览: @component注解是什么?

spring注解中@component就是说把这个类交给Spring管理,又一次起个名字叫userManager,因为不清楚这个类是属于哪个层面,所以就用@Component。
因为在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视。
介绍
@controller控制器(注入服务)用于标注控制层,至关于struts中的action层web。
@service服务(注入dao)用于标注服务层,主要用来进行业务的逻辑处理redis。
@repository(实现dao访问)用于标注数据访问层,也能够说用于标注数据访问组件,即DAO组件.spring。
@component(把普通pojo实例化到spring容器中,至关于配置文件中的)泛指各类组件,就是说当咱们的类不属于各类归类的时候(不属于@Controller、@Services等的时候),就能够使用@Component来标注这个类。

@configuration和@component之间的区别是什么?

@configuration和@component之间的区别是:@Component注解的范围最广,所有类都可以注解,但是@Configuration注解一般注解在这样的类上:这个类里面有@Value注解的成员变量和@Bean注解的方法,就是一个配置类。
@configuration和@component相同点是都是注解在类上的注解。
Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
configuration 英[k?n?f?g??re??n] 美[k?n?f?gj??re??n]
词类:n. 配置; 布局,构造; [化] (分子中原子的) 组态,排列; [物] 位形,组态;
例句:Prices range from$ 119 to$ 199, depending on the particular configuration.
价格因具体配置而异,从119美元至199美元不等。
component 英[k?m?p??n?nt] 美[k?m?po?n?nt]
词类:n. 成分; 组分; 零件; [数] 要素;
adj. 成分的; 组成的; 合成的; 构成的;
例句:Enriched uranium is a key component of a nuclear weapon
浓缩铀是核武器的关键组成部分。

注解service和component的区别

可以点进@service注解看一下,@service引用了@component注解,也就是component注解实现的功能@service都能实现,而@service是对@component进一步拓展,被@service注解标注的类会被spring认定是业务逻辑层,里面有spring对业务逻辑层管理的一对逻辑。
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

ComponentScan注解的扫描范围及源码解析

一,ComponentScan注解的默认扫描范围

ComponentScan注解的默认扫描范围是启动程序XxxApplication. java所在目录及其下的所有子包。

为了方便理解,我们看一下下面这个图片。

这个项目中的启动类是:SpringbootApplication.java

该启动类所在的目录是:springboot

那么ComponentScan注解的默认扫描范围是:springboot目录及其下面的所有子包。

二,如何修改ComponentScan注解的扫描范围

ComponentScan注解即可以扫描包,也可以扫描指定的类。我们只需要指定一个包扫描的路径,就可以实现更改包扫描路径的功能了。

1,ComponentScan注解扫描包。

@ComponentScan({"com.company.user","com.company.service"})

2,ComponentScan注解扫描类。

@ComponentScan(basePackageClasses={XxxService.class})

三,ComponentScan注解

ComponentScan注解中定义了12个属性,我们下面详细来看一下。我们的讨论是基于java8的,spring-context的版本是4.3.7。

1,String[] value() default {};

指定包扫描路径,value属性的值,就是项目中的一个具体路径。value属性的类型是String数组,也就是支持一次指定多个包扫描路径。这个属性上面添加了一个注解,@AliasFor("basePackages"),这个注解的意思就是说,value这个属性等价于basePackages属性。关于basePackages属性,下面会讲到。

2,String[] basePackages() default {};

指定包扫描路径,basePackages属性的值,就是项目中的一个具体路径。basePackages属性的类型是String数组,也就是支持一次指定多个包扫描路径。basePackages属性上面添加了一个注解,@AliasFor("value"),这个注解的意思就是说,basePackages这个属性等价于value属性。

3,Class
[] basePackagesClasses() default {};

扫描具体的类。basePackagesClasses属性的类型是Class数组,也就是说支持同时指定多个扫描类。

4,Class
nameGenerator() default BeanNameGenerator. class;

配置beanName生成器,默认是BeanNameGenerator。一般情况下,我们都是使用默认的beanName生成器,但是Spring实现了beanName生成器的可配置。

5,Class
scopeResolver() default AnnotationScopeMetaDataResolver.class;

处理检测到的bean的scope范围。什么意思呢?我们都知道spring的bean是有作用域的,默认是singleton,这个默认值就是在ScopeMetaData类中指定的:

private String scopeName = "singleton";

这个属性也是可选配置,默认的处理bean作用域的实现类是AnnotationScopeMetaDataResolver.class。源码比较简单,就是取注解上获取指定的scope的value值,如果没有配置,就是用默认的singleton。

6,ScopedProxyMode scopedProxy() default ScopedProxyMode. DEFAULT;

是否为检测到的组件生成代理。

ScopedProxyMode是一个枚举类,可选值有四个:DEFAULT,NO,INTERFACES,TARGET_CLASS。

7,String resourcePattern() default """**/*.class";

控制符合组件检测条件的类文件,默认是包扫描下的? **/*.class。

8,boolean useDefaultFilters() default true;

是否对含有以下注解的类开启检测,默认是开启的。

@Component

@Repository

@Service

@Controller

9,ComponentScan.Filter[] includeFilters() default {};

指定某些Filter扫描到的类。听起来有些费劲,说白了就是指定了类型,扫描指定的这些类型。可选类型有5种,定义在枚举类FilterType中:

第一种:ANNOTATION

第二种:ASSIGNABLE_TYPE

第三种:ASPECTJ

第四种:REGEX,正则表达式。

第五种:CUSTOM,自定义类型。

10,ComponentScan.Filter[] excludeFilters() default {};

排除过滤器扫描的的类。

11,boolean lazyInit() default false;

扫描到的类是否开启懒加载,默认不开启。

12,

@Retention(RetentionPolicy.RUNTIME);

@Target({})

public @interface Filter {

FilterType type() default FilterType. ANNOTATION;

@AliasFor("classes")

Class
[] value() default {};

@AliasFor("value")

Class
[] classes() default {};

String[] pattern() default {};

}

springmvc与mybatis整合中mapper接口中注解component是什么意思

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
(把普通pojo实例化到spring容器中,相当于配置文件中的

spring的注解有哪些

多个包逗号隔开。
1、@Component
@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
2、@Controller
@Controller对应表现层的Bean,也就是Action,例如:
1 @Controller
2 @Scope("prototype")
3 public class UserAction extends BaseAction

{

4 ……

5 }

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。

这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象

3、@ Service

@Service对应的是业务层Bean,例如:

1 @Service("userService")

2 public class UserServiceImpl implements UserService {

3 ………

4 }

@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:

1 // 注入userService

2 @Resource(name = "userService")

3 private UserService userService;

注意:在Action声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。

4、@ Repository

@Repository对应数据访问层Bean ,例如:

1 @Repository(value="userDao")

2 public class UserDaoImpl extends BaseDaoImpl

阅读更多 >>>  linux系统如何设备自启动

{

3 ………

4 }

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

1 // 注入userDao,从数据库中根据用户Id取出指定用户时需要用到

2 @Resource(name = "userDao")

3 private BaseDao

userDao;

抽象类可以打@component注解吗

不可以。抽象类是一个类的模板或蓝图,它不能被实例化,由于抽象类本身不能被实例化,因此无法提供任何元数据信息,也就无法使用注解来提供额外的信息。

Spring注解——使用@ComponentScan自动扫描组件

1.创建一个配置类,在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的

2.使用 ApplicationContext 的 getBeanDefinitionNames() 方法获取已经注册到容器中的 bean 的名称。

运行效果:

除了 spring 本身注册的一些 bean 之外,可以看到最后一行,已经将 BeanConfig 这个类注册进容器中了。

3.指定要扫描的包(使用@ComponentScan 的 valule 属性来配置),创建一个controller 包,并在该包下新建一个 AppController 类。

在类上加了@Controller注解,说明该类是一个 Component。在 BeanConfig 类中修改:

在 @ComponentScan 注解中指定了要扫描的包。

运行效果:

AppController 已经被注册进容器了。

4.excludeFilters 和 includeFilters 的使用

使用 excludeFilters 来按照规则排除某些包的扫描。

excludeFilters 的参数是一个 Filter[] 数组,然后指定 FilterType 的类型为 ANNOTATION,也就是通过注解来过滤,最后的 value 则是Controller 注解类。配置之后,在 spring 扫描的时候,就会跳过 io.mieux 包下,所有被 @Controller 注解标注的类。

使用 includeFilters 来按照规则只包含某些包的扫描。

在创建一个 service 的包,并创建一个 AppService 类,再加上一个 @Service 注解。

修改 BeanCofig 类:

运行效果:

配置里面,应该是只包含 @Controller 注解的类才会被注册到容器中,为什么 @Service 注解的类也被注册了呢?这里涉及到 @ComponentScan 的一个 useDefaultFilters 属性的用法,该属性默认值为 true,也就是说 spring 默认会自动发现被 @Component、@Repository、@Service 和 @Controller 标注的类,并注册进容器中。要达到只包含某些包的扫描效果,就必须将这个默认行为给禁用掉(在 @ComponentScan 中将 useDefaultFilters 设为 false 即可)。

运行效果:

5.添加多种扫描规则

1、如果使用的 jdk8,则可以直接添加多个 @ComponentScan 来添加多个扫描规则,但是在配置类中要加上 @Configuration 注解,否则无效。

2、也可以使用 @ComponentScans 来添加多个 @ComponentScan,从而实现添加多个扫描规则。同样,也需要加上 @Configuration 注解,否则无效。

6.添加自定义过滤规则

在前面使用过 @Filter 注解,里面的 type 属性是一个 FilterType 的枚举类型:

使用 CUSTOM 类型,就可以实现自定义过滤规则。

1、 首先创建一个实现 TypeFilter 接口的 CustomTypeFilter 类,并实现其 match 方法。

这里简单对扫描到的类名进行判断,如果类名包含”Co“的就符合条件,也就会注入到容器中。

2、对 BeanConfig 进行修改,指定过滤类型为 Custom 类型,并指定 value 为 CustomTypeFilter.class。

运行效果:

没有component注解可以被注入吗

不是用的注解,那肯定就是在spring的配置文件applicationContext.xml里配置了

。不一定说非得用注解才能注入的,用xml也能注入,道理是一样的。

你的第一个问题,在struts里写时应该是这样的,

这里的class是spring配置文件里的某个bean的id, 这样struts才会交给spring去实例化action。

网站数据信息

"component注解,注解service和component的区别"浏览人数已经达到16次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:component注解,注解service和component的区别的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!