当前位置:文档之家› Spring注解一览

Spring注解一览

Spring注解一览
Spring注解一览

注册注解处理器

? 方式一:bean

? 方式二: 命名空间

将隐式地向Spring 容器注册AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor 、PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这4 个BeanPostProcessor 。

? 方式三: 命名空间

如果要使注解工作,则必须配置component-scan ,实际上不需要再配置annotation-config。

base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。还允许定义过滤器将基包下的某些类纳入或排除。

? Spring 支持以下4 种类型的过滤方式:

? 注解org.example.SomeAnnotation 将所有使用SomeAnnotation 注解的类过滤出来

? 类名指定org.example.SomeClass 过滤指定的类

? 正则表达式com.kedacom.spring.annotation.web..* 通过正则表达式过滤一些类

? AspectJ 表达式org.example..*Service+ 通过AspectJ 表达式过滤一些类

? 正则表达式的过滤方式举例:

expression="com.casheen.spring.annotation.web..*"/>

? 注解的过滤方式举例:

expression="org.springframework.stereotype.Controller"/>

expression="org.springframework.stereotype.Service"/>

expression="org.springframework.stereotype.Repository"/>

启用Spring MVC 注解

? 启动Spring MVC 的注解功能,完成请求和注解POJO 的映射

?

注解介绍

? @Controller

? @Service

? @Autowired

? @RequestMapping

? @RequestParam

? @ModelAttribute

? @Cacheable

? @CacheFlush

? @Resource

? @PostConstruct

? @PreDestroy

? @Repository

? @Component (不推荐使用)

? @Scope

? @SessionAttributes

? @InitBinder

? @Required

? @Qualifier

@Controller

? 例如

@Controller

public class SoftCreateController extends SimpleBaseController {}

? 或者

@Controller("softCreateController")

? 说明

@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写

@Service

? 例如

@Service

public class SoftCreateServiceImpl implements ISoftCreateService {}

? 或者

@Service("softCreateServiceImpl")

? 说明

@Service 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写

@Autowired

? 例如

@Autowired

private ISoftPMService softPMService;

? 或者

@Autowired(required=false)

private ISoftPMService softPMService = new SoftPMServiceImpl();

? 说明

@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行

查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时,才会使用new SoftPMServiceImpl();

@Autowired 标注作用于Map 类型时,如果Map 的key 为String 类型,则Spring 会将容器中所有类型符合Map 的value 对应的类型的Bean 增加进来,用Bean 的id 或name 作为Map 的key。

@Autowired 还有一个作用就是,如果将其标注在BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么Spring 会自动注入这些实现类的实例,不需要额外的操作。

@RequestMapping

? 类

@Controller

@RequestMapping("/bbtForum.do")

public class BbtForumController {

@RequestMapping(params = "method=listBoardTopic")

public String listBoardTopic(int topicId,User user) {}

}

? 方法

@RequestMapping("/softpg/downSoftPg.do")

@RequestMapping(value="/softpg/ajaxLoadSoftId.do",method = POST)

@RequestMapping(value = "/osu/product/detail.do", params = { "modify=false" }, method =POST)

? 说明

@RequestMapping 可以声明到类或方法上

? 参数绑定说明

如果我们使用以下的URL 请求:

http://localhost/bbtForum.do?method=listBoardTopic&topicId=1&userId=10&userName=tom

topicId URL 参数将绑定到topicId 入参上,而userId 和userName URL 参数将绑定到user 对象的userId 和userName 属性中。和URL 请求中不允许没有topicId 参数不同,虽然User 的userId 属性的类型是基本数据类型,但如果URL 中不存在userId 参数,Spring 也不会报错,此时https://www.doczj.com/doc/bb10291755.html,erId 值为0 。如果User 对象拥有一个dept.deptId 的级联属性,那么它将和dept.deptId URL 参数绑定。

@RequestParam

? 参数绑定说明

@RequestParam("id")

http://localhost/bbtForum.do?method=listBoardTopic&id=1&userId=10&userName=tom

listBoardTopic(@RequestParam("id")int topicId,User user) 中的topicId 绑定到id 这个URL 参数,那么可以通过对入参使用@RequestParam 注解来达到目的

@RequestParam(required=false):参数不是必须的,默认为true

@RequestParam(value="id",required=false)

请求处理方法入参的可选类型

? Java 基本数据类型和String

默认情况下将按名称匹配的方式绑定到URL 参数上,可以通过@RequestParam 注解改变默认的绑定规则

? request/response/session

既可以是Servlet API 的也可以是Portlet API 对应的对象,Spring 会将它们绑定到Servlet 和Portlet 容器的相应对象上

? org.springframework.web.context.request.WebR equest

内部包含了request 对象

? java.util.Locale

绑定到request 对应的Locale 对象上

? java.io.InputStream/java.io.Reader

可以借此访问request 的内容

? java.io.OutputStream / java.io.Writer

可以借此操作response 的内容

? 任何标注了@RequestParam 注解的入参

被标注@RequestParam 注解的入参将绑定到特定的request 参数上。

? java.util.Map / org.springframework.ui.ModelMap

它绑定Spring MVC 框架中每个请求所创建的潜在的模型对象,它们可以被Web 视图对象访问(如JSP )

? 命令/ 表单对象(注:一般称绑定使用HTTP GET 发送的URL 参数的对象为命令对象,而称绑定使用HTTP POST 发送的URL 参数的对象为表单对象)

它们的属性将以名称匹配的规则绑定到URL 参数上,同时完成类型的转换。

而类型转换的规则可以通过@InitBinder 注解或通过HandlerAdapter 的配置进行调整

? org.springframework.validation.Errors / org.springframework.validati on.BindingResult

为属性列表中的命令/ 表单对象的校验结果,注意检验结果参数必须紧跟在命令/ 表单对象的后面

? org.springframework.web.bind.support.SessionStatus

可以通过该类型status 对象显式结束表单的处理,这相当于触发session 清除其中的通过@SessionAttributes 定义的属性

请求处理方法返回值的可选类型

? void

此时逻辑视图名由请求处理方法对应的URL 确定,如以下的方法:

@RequestMapping("/welcome.do")

public void welcomeHandler() {}

对应的逻辑视图名为“ welcome ”

? String

此时逻辑视图名为返回的字符,如以下的方法:

@RequestMapping(method = RequestMethod.GET)

public String setupForm(@RequestParam("ownerId") int ownerId, ModelMap model) {

Owner owner = this.clinic.loadOwner(ownerId);

model.addAttribute(owner);

return "ownerForm";

}

对应的逻辑视图名为“ ownerForm ”

? org.springframework.ui.ModelMap

和返回类型为void 一样,逻辑视图名取决于对应请求的URL ,如下面的例子:

@RequestMapping("/vets.do")

public ModelMap vetsHandler() {

return new ModelMap(this.clinic.getVets());

}

对应的逻辑视图名为“ vets ” ,返回的ModelMap 将被作为请求对应的模型对象,可以在JSP 视图页面中访问到。

? ModelAndView

当然还可以是传统的ModelAndView 。

@ModelAttribute

? 作用域:request

? 例如

@RequestMapping("/base/userManageCooper/init.do")

public String handleInit(@ModelAttribute("queryBean") ManagedUser sUser,Model model,){

? 或者

@ModelAttribute("coopMap")// 将coopMap 返回到页面

public Map coopMapItems(){}

? 说明

@ModelAttribute 声明在属性上,表示该属性的value 来源于model 里"queryBean" ,并被保存到model 里@ModelAttribute 声明在方法上,表示该方法的返回值被保存到model 里

@Cacheable 和@CacheFlush

? @Cacheable:声明一个方法的返回值应该被缓存

例如:@Cacheable(modelId = "testCaching")

? @CacheFlush :声明一个方法是清空缓存的触发器

例如:@CacheFlush(modelId = "testCaching")

? 说明

要配合缓存处理器使用,参考:https://www.doczj.com/doc/bb10291755.html,/blog/603719

@Resource

? 例如

@Resource

private DataSource dataSource; // inject the bean named "dataSource"

? 或者

@Resource(name="dataSource")

@Resource(type=DataSource.class)

? 说明

@Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找,

此时与@Autowired 类似

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

@PostConstruct 和@PreDestroy

? @PostConstruct

在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执行(注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。

? @PreDestroy

在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。

@Repository

? 与@Controller 、@Service 类似,都是向spring 上下文中注册bean ,不在赘述。

@Component (不推荐使用)

? @Component

@Component 是所有受Spring 管理组件的通用形式,Spring 还提供了更加细化的注解形式:@Repository 、@Service 、@Controller ,它们分别对应存储层Bean ,业务层Bean ,和展示层Bean 。

目前版本(2.5 )中,这些注解与@Component 的语义是一样的,完全通用,在Spring 以后的版本中可能会给它们追加更多的语义。所以,我们推荐使用@Repository 、@Service 、@Controller 来替代@Component 。

@Scope

? 例如

@Scope("session")

@Repository()

public class UserSessionBean implementsSerializable {}

? 说明

在使用XML 定义Bean 时,可以通过bean 的scope 属性来定义一个Bean 的作用范围,同样可以通过@Scope 注解来完成

@Scope中可以指定如下值:

singleton:定义bean的范围为每个spring容器一个实例(默认值)

prototype:定义bean可以被多次实例化(使用一次就创建一次)

request:定义bean的范围是http请求(springMVC中有效)

session:定义bean的范围是http会话(springMVC中有效)

global-session:定义bean的范围是全局http会话(portlet中有效)

@SessionAttributes

? 说明

Spring 允许我们有选择地指定ModelMap 中的哪些属性需要转存到session 中,

以便下一个请求属对应的ModelMap 的属性列表中还能访问到这些属性。

这一功能是通过类定义处标注@SessionAttributes 注解来实现的。

@SessionAttributes 只能声明在类上,而不能声明在方法上。

? 例如

@SessionAttributes("currUser") // 将ModelMap 中属性名为currUser 的属性@SessionAttributes({"attr1","attr2"})

@SessionAttributes(types = User.class)

@SessionAttributes(types = {User.class,Dept.class})

@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"})

@InitBinder

? 说明

如果希望某个属性编辑器仅作用于特定的Controller ,

可以在Controller 中定义一个标注@InitBinder 注解的方法,

可以在该方法中向Controller 了注册若干个属性编辑器

? 例如

@InitBinder

public void initBinder(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false);

binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); }

@Required

? 例如

@required

public setName(String name){}

? 说明

@ required 负责检查一个bean在初始化时其声明的set方法是否被执行,当某个被标注了@Required 的Setter 方法没有被调用,则Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。@Required 注解只能标注在Setter 方法之上。因为依赖注入的本质是检查Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非setXxxx() 类型的方法则被忽略。

@Qualifier

? 例如

@Autowired

@Qualifier("softService")

private ISoftPMService softPMService;

? 说明

使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用@Qualifier("beanName"),明确指定bean的名称进行注入,此时与@Resource指定name 属性作用相同。

Spring考试

1. (单选题)下列关于Spring配置文件的说法不正确的是 o A. Spring默认是读取/WEB-INF/配置文件 o B. Spring的配置文件可以配置在类路径下,并可以重命名,但是需要在文件中指定 o C. 把文件放到src目录下,Spring也可以读到 o D. 可以通过在中的进行指定 Spring配置文件 正确答案:C 把文件放到src目录下,需要在web。xml里设置 contextConfigLocation /WEB-INF/classes/ 可以让spring读到 2. (单选题)下列关于Spring特性中IoC描述错误的是 o A. IoC就是指程序之间的关系由程序代码直接操控 o B. 所谓“控制反转”是指控制权由应用代码转到外部容器,即控制权的转移 o C. IoC将控制创建的职责搬进了框架中,从应用代码脱离开来 o D. 使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC 容器会根据XML配置数据提供给它

正确答案:A IOC是来完成相互依赖的对象的创建、协调工作。 3. (单选题)下列关于Spring的装配模式(default-autowire)描述不正确的是 o A. Spring中,至少有两种装配模式,按“类型”和“名字” o B. Spring中默认是按名字进行装配的 o C. 可以用default-autowire=”byType”配置按类型装配 o D. 一旦在一个Spring配置文件中配置了default-autowire=”byType”,其它的配置文件也是按此种装配方式进行装配 正确答案:D 在标签中指定default-autowire属性,那么对于子标签 如果没有单独的设置autowire属性,那么将采用父标签 的default-autowire属性的模式,如果单独设置了autowire 属性,则采用自己的模式 4. (单选题)下列选项关于Spring的核心机制——依赖注入的描述正确的是 o A. 所谓依赖注入就是明确地定义组件接口,独立开发各个组件,然后根据组件间的依赖关系组装运行的设计开发模式 o B. Spring不负责管理bean之间的关系 o C. 节点有可选的子节点,用于注入bean的属性 o D. 在Spring的配置文件中,使用来创建Bean的实例 正确答案:B Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean并建立Bean之间的依赖关系。spring的ioc容器在完成这些底层工作的基础上,还提供了bean实例缓存,生命周期管理,bean实例代理,事件发布,资源装载等高级服务 5.

springMVC详解以及注解说明

springMVC详解以及注解说明 基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置Bean、装配Bean 的功能,您可以使用基于注释的Spring IoC 替换原来基于XML 的配置。本文通过实例详细讲述了Spring 2.5 基于注释IoC 功能的使用。 概述 注释配置相对于XML 配置具有很多的优势: ? 它可以充分利用Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用JPA 注释配置ORM 映射时,我们就不需要指定PO 的属性名、类型等信息,如果关系表字段和PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java 反射机制获取。 ? 注释和Java 代码位于一个文件中,而XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。 因此在很多情况下,注释配置比XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。在这篇文章里,我们将向您讲述使用注释进行Bean 定义和依赖注入的内容。 Spring2.5的注释 Spring 2.5 提供了AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor这四个主要的关于Annotation 的BeanPostProcessor。 我们可以使用 来方便地、一次性的声明者四个BeanPostProcessor。 1.Autowired... 提供对Spring 特有的Autowired 和Qualifier 注释。

spring的@Transactional注解详细用法

spring的@Transactional注解详细用法 各位读友大家好!你有你的木棉,我有我的文章,为了你的木棉,应读我的文章!若为比翼双飞鸟,定是人间有情人!若读此篇优秀文,必成天上比翼鸟! spring的@Transactional注解详细用法Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API 提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用提供比其他事务API如JTA更简单的编程式事务管理API与spring数据访问抽象的完美集成事务管理方式spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。显然声明式事务管理要优于编程式事务管理,这正是spring

spring配置和注解开发原理

1、Spring是一个开源、轻量级框架(轻量级是指依赖的东西少) 2、Spring核心控制反转(IoC)和面向切面(AOP)。 ——AOP:面向切面编程,扩展功能时不用修改源代码 ——IOC:创建对象不再是自己new出来,而是交给spring容器管理 3、Spring希望为企业应用提供一站式(one-stopshop)的解决方案。 一站式:从web层到访问数据库层都有相应解决方案。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 对象的创建交给spring管理(基于配置的方式实现、基于注解的方式实现) IOC底层原理:Xml配置、dom4j解析xml、工厂设计模式、反射 工厂模式:将对象的创建交给工厂,使用时调用工厂方法来获取。A需要B时,不是直接创建B,而是通过C的方法来获取,C的方法用来创建B。 注解方式原理:

Spring整合web框架原理 1、把加载配置文件和创建对象的过程,在服务器启动的时候完成。 2、用监听器实现 Spring注解: ————注解是代码里面的特殊标签,使用注解可以完成一定功能; 注解写法@注解名(属性名称=属性值);注解可以用在类上、方法上、属性上。 注解使用: 1、在对应类上加上注解,标明该类的创建交给spring来管理。

2、开启注解扫描功能,要指明扫描哪些包。 3、如果要为属性注入,则在属性上使用@autowired注解 AOP概念: 面向切面编程,扩展功能而不用修改源代码,采用横向抽取机制,取代了传统的纵向继承。 传统的纵向继承,耦合度太高 AOP底层使用动态代理实现:a. 如果是有接口的情况,使用动态代理创建接口实现类代理对象,b.如果没有接口,使用动态代理创建类的子类的代理对象。

spring使用基于注解的AOP事务管理

spring使用基于注解的AOP事务管理 16.6 AOP事务管理 AOP事务管理利用了Spring AOP的基础设施,在大多数情况下,Spring AOP会创建一个JDK代理以拦截方法调用。你可以使用装载时编织以在装载期编织切面,这样就不需要代理了(如果你记不清什么是装载时编织,请参看第6章)。你有两种方式来配置Spring AOP 事务管理,基于注解的配置以及XML配置。 16.6.1 使用基于注解的AOP事务管理 你可以借助于AOP的自动代理,通过注解将事务性行为引入到现有的bean中。让我们以代码清单16-21开始吧,它展示了类DeclarativeTxBankService。 代码清单16-21 DeclarativeTxBankService实现 请注意@Transactional属性,为了让Spring的事务管理基础设施可以利用该属性创建恰当的切入点和通知,我们需要使用AOP的自动代理和注解驱动的事务支持。代码清单16-22展示了与该注解相对应的XML配置。 代码清单16-22 基于注解的事务管理的配置文件

该XML配置文件展示了标准的bankService bean声明,紧跟其后的是 标签。 标签使用@Transactional注解创建恰当的事务管理切面。接下来由通知匹配的bean。 1.探索tx:annotation-driven标签 标签是注解驱动的事务管理支持的核心。表16-3列出了 标签的所有属性。 表16-3 标签的属性 属性说明 transactionManager 指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用 mode 指定Spring事务管理框架创建通知bean的方式。 可用的值有proxy和aspectj。前者是默认值, 表示通知对象是个JDK代理;后者表示 Spring AOP会使用AspectJ创建代理 order 指定创建的切面的顺序。只要目标对象有多个通知就可以使用该属性 proxy-target-class 该属性如果为true就表示你想要代理目标类而不是bean所实现的所有接口

基于注解的Spring AOP的配置和使用

基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。 AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制——粘贴式的代码会给程序的维护带来不便,AOP就实现了把这些业务需求与系统需求分开来做。这种解决的方式也称代理机制。 先来了解一下AOP的相关概念,《Spring参考手册》中定义了以下几个AOP的重要概念,结合以上代码分析如下: ?切面(Aspect):官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext 中来配置。 ?连接点(Joinpoint):程序执行过程中的某一行为,例如,UserService.get 的调用或者UserService.delete抛出异常等行为。 ?通知(Advice):“切面”对于某个“连接点”所产生的动作,例如,TestAspect 中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如ServiceAspect。?切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定。 ?目标对象(Target Object):被一个或者多个切面所通知的对象。例如,AServcieImpl和BServiceImpl,当然在实际运行时,Spring AOP采用代理实现,实际AOP操作的是TargetObject的代理对象。 ?AOP代理(AOP Proxy):在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。 强制使用CGLIB代理需要将 的 proxy-target-class属性设为true。 通知(Advice)类型: ?前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在 里面使用元素进行声明。例如,TestAspect中的doBefore方法。

Spring注解@Componen、@Repository@Service、@Controller区别

Spring 2.5 中除了提供@Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和@Controller。在目前的Spring 版本中,这3 个注释和@Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和@Component 相比没有什么新意,但Spring 将在以后的版本中为它们添加特殊的功能。所以,如果Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service 和@Controller 对分层中的类进行注释,而用@Component 对那些比较中立的类进行注释。 在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息: Java代码 1. 3. 4. 5. 6. 其中base-package为需要扫描的包(含所有子包)@Service用于标注业务层组件,@Controller用于标注控制层组件(如struts中的action),@Repository用于标注数据访问组件,即DAO组件,而@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 7. @Service public class VentorServiceImpl implements iVentorService { 8. } @Repository public class VentorDaoImpl implements iVentorDao { 9. } getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法(方法名任意):@PostConstruct public void init() { 10. } 11. @PreDestroy public void destory() { 12. } 注入方式: 把DAO实现类注入到service实现类中,把service的接口(注意不要是service的实现类)注入到action中,注

Spring注解详解

Spring注解详解 目录 一、注解说明 (2) 1.使用简化配置 (2) 2.使用Bean定义注解 (2) 3.Spring支持以下4种类型的过滤方式: (2) 二、注解介绍 (2) 1.@Controller (3) 2.@Service (3) 3.@Autowired (4) 4.@RequestMapping (4) 5.@RequestParam (5) 6.@ModelAttribute (6) 7.@Cacheable和@CacheFlush (7) 8.@Resource (7) 9.@PostConstruct和@PreDestroy (8) 10.@Repository (8) 11.@Component(不推荐使用) (8) 12.@Scope (8) 13.@SessionAttributes (9) 14.@InitBinder (9) 15.@Required (9) 16.@Qualifier (10)

一、注解说明 1.使用简化配置 将隐式地向Spring容器注册以下4个BeanPostProcessor: AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor PersistenceAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor 2.使用Bean定义注解 如果要使注解工作,则必须配置component-scan,实际上不需要再配置annotation-config。base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。还允许定义过滤器将基包下的某些类纳入或排除。 3.Spring支持以下4种类型的过滤方式: 1)注解org.example.SomeAnnotation将所有使用SomeAnnotation注解的类过滤出来 2)类名指定org.example.SomeClass过滤指定的类 3)正则表达式com.kedacom.spring.annotation.web..*通过正则表达式过滤一些类 4)AspectJ表达式org.example..*Service+通过AspectJ表达式过滤一些类 二、注解介绍 注解种类: 1)@Controller 2)@Service 3)@Autowired 4)@RequestMapping 5)@RequestParam 6)@ModelAttribute

Java Spring各种依赖注入注解的区别

Spring对于Bean的依赖注入,支持多种注解方式: 直观上看起来,@Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,Spring 对这些注解也进行了支持。但是使用起来这三者到底有什么区别呢?笔者经过方法的测试,发现一些有意思的特性。 区别总结如下: 一、@Autowired有个required属性,可以配置为false,这种情况下如果没有找到对应的bean 是不会抛异常的。@Inject和@Resource没有提供对应的配置,所以必须找到否则会抛异常。 二、@Autowired和@Inject基本是一样的,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。但是@Resource是个例外,它使用的是CommonAnnotationBeanPostProcessor来处理依赖注入。当然,两者都是BeanPostProcessor。

TIPS Qualified name VS Bean name 在Spring设计中,Qualified name并不等同于Bean name,后者必须是唯一的,但是前者类似于tag或者group的作用,对特定的bean进行分类。可以达到getByTag(group)的效果。对于XML配置的bean,可以通过id属性指定bean name(如果没有指定,默认使用类名首字母小写),通过标签指定qualifier name: 如果是通过注解方式,那么可以通过@Qualifier注解指定qualifier name,通过@Named或者@Component(@Service,@Repository等)的value值指定bean name:

SpringBoot中必须掌握的27个注解

SpringBoot中必须掌握的27个注解 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成。 而Spring Boot之所以能够轻松地实现应用的创建及与其他框架快速集成,最核心的原因就在于它极大地简化了项目的配置,最大化地实现了“约定大于配置”的原则。然而基于Spring Boot虽然极大地方便了开发,但是也很容易让人“云里雾里”,特别是各种注解很容易让人“知其然而不知其所以然。 所以,要想用好Spring Boot就必须对其提供的各类功能注解有一个全面而清晰地认识和理解。一方面可以提高基于Spring Boot的开发效率,另一方面也是面试中被问及框架原理时所必需要掌握的知识点。在接下来的内容中,小编就带大家一起来探究下Spring Boot的一些常用注解吧! 一、Spring相关6个基础注解 Spring Boot的有些注解也需要与Spring的注解搭配使用,这里小编梳理了在项目中与Spring Boot注解配合最为紧密的6个Spring基础框架的注解。如 1、@Configuration 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。 2、@ComponentScan 做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。 3、@Conditional @Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition 接口,然后对该实现接口的类设置是否装载的条件。 Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。

SpringMVC常用注解说明

SpringMVC常用注解: 1、@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。 @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了 @RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用 @RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式: (1)在SpringMVC 的配置文件中定义MyController 的bean 对象。 (2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。

spring注解详细介绍

使用Spring2.5的Autowired实现注释型的IOC 161641 使用Spring2.5的新特性——Autowired可以实现快速的自动注入,而无需在xml文档里面添加bean的声明,大大减少了xml文档的维护。(偶喜欢这个功能,因为偶对xml不感冒)。以下是一个例子: 先编写接口Man: public interface Man { public String sayHello(); } 然后写Man的实现类Chinese和American: @Service public class Chinese implements Man{ public String sayHello() { return "I am Chinese!"; } } @Service public class American implements Man{ public String sayHello() { return "I am American!"; } } @Service注释表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,American实例化为american,如果需要自己改名字则:@Service("你自己改的bean名")。 beans.xml 在spring的配置文件里面只需要加上,可以使用base-package="*"表示全部的类。 编写主类测试: @Service public class Main {

spring注解注入示例详解

一、各种注解方式 1.@Autowired注解(不推荐使用,建议使用@Resource) @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。 @Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。要使@Autowired能够工作,还需要在配置文件中加入以下 Xml代码 1. 2. @Qualifier注解 @Autowired是根据类型进行自动装配的。例如,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用 @Qualifier配合@Autowired来解决这些问题。如下: 1). 可能存在多个UserDao实例 Java代码 1.@Autowired 2.@Qualifier("userServiceImpl") 3.public IUserService userService; 或者 Java代码 1.@Autowired 2.public void setUserDao(@Qualifier("userDao") UserDao userDao) { https://www.doczj.com/doc/bb10291755.html,erDao = userDao; 4.} 这样,Spring会找到id为userServiceImpl和userDao的bean进行装配。 2). 可能不存在UserDao实例 Java代码 1.@Autowired(required = false) 2.public IUserService userService;

Spring@Autowired注解与自动装配

@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用; @Autowired可以对成员变量进行标注 1.package com.baobaotao; 2.import org.springframework.beans.factory.annotation.Autowired; 3.public class Boss { 4.@Autowired 5.private Car car; 6.@Autowired 7.private Office office; 8.… 9.} 在applicationContext.xml中把原来引用的标签也去掉。 1. 2. 6. 7. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按

Spring初学文档

Spring2.5注释驱动 8.4.1 Spring2.5注释驱动 注释语法越来越多的被业界所使用,并且注释配置相对于 XML 配置具有很 多的优势:它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。 在使用注释配置之前,先来回顾一下传统上是如何配置 Bean 并完成 Bean 之间依赖关系的建立。 代码清单1 Foo.java Foo对象有一个String类型的name属性. package ; public class Foo { private String name; public String toStirng(){ return"Foo Name is :" + https://www.doczj.com/doc/bb10291755.html,; } Set和get方法 }

代码清单2 Bar.java Bar对象有一个String类型的add属性. package ; public class Bar { private String add; public String toStirng(){ return"Bar Add is :" + this.add; } Set和get方法 } 代码清单3 Main.java Main对象有两个属性分别是Foo和Bar package ; public class Main { private Foo foo; private Bar bar; public String toString(){ return"Main : [" + +" "+ + "]"; } Set和get方法 } 代码清单4 配置文件spring-config-beans.xml

Spring注解的参数

Spring注解的参数 二、Spring2.5引入注解式处理器支持,通过@Controller和@RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解: 需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller和@RequestMapping注解的处理器。 @Controller:用于标识是处理器类; @RequestMapping:请求到处理器功能方法的映射规则; @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;@RequestParam是传参数的

@ModelAttribute:请求参数到命令对象的绑定; @SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session 中; @InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型; 三、Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持: @CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定; @RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定; @RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换); @ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);

Java笔试题库⑦

1,关于Spring MVC的核心控制器DispatcherServlet的作用,以下说法错误的是() A,它负责接收HTTP请求 B,加载配置文件 C,实现业务操作 D,初始化上下应用对象ApplicationContext 正确答案:C SpringMVC是Spring中的模块,它实现了mvc设计模式,首先用户发起请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求 处理器映射器查找匹配该url的handle,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handle进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染,并 把数据装入到request域,返回给用户。 DispatcherServlet作为SpringMVC的前端控制器,负责接收用户的请求,并根据 用户的请求返回相应的视图给用户。实现业务在service层,所以c答案错误。 2,下面有关spring的依赖注入,说法错误的是() A,依赖注入通常有如下两种:设值注入和构造注入: B,构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入 C,当设值注入与构造注入同时存在时,先执行构造注入,再执行设值注入 D,设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例。这种注入方式比较简单、直观 正确答案:C 使用构造函数依赖注入时,Spring保证一个对象所有依赖的对象先实例化后,才实 例化这个对象。使用set方法依赖注入时,Spring首先实例化对象,然后才实例化所有依赖的对象。 当设值注入与构造注入同时存在时,先执行设值注入,再执行构造注入。 3,将元数据配置到Spring容器,下面哪个方法是不正确的() A,通过编组与解组对象 B,注解基础配置 C,Java基础配置 D,XML基础配置 正确答案:A 有三种方式向Spring 容器提供元数据:1,XML配置文件;2,基于注解配置;3,基于Java的配置,死概念记住即可。

相关主题
文本预览
相关文档 最新文档