`

spring注解与jsr250,330

阅读更多
Spring自带部分:

1.依赖注入注解部分:

1、@Autowired:自动装配
@Autowired默认是根据类型注入,不会使用名字,除非配置了@qualifier();
可以用于构造器、字段、方法注入,
使用方式如下:
@Autowired(required=true)
构造器、字段、方法(setter(A a)&other(A a,...))
(如果用 @Autowired 同时标注了多个构造函数,那么,Spring 将采用贪心算法匹配构造函数 ( 构造函数最长 ))
注意事项:
@Autowired默认是根据参数类型进行自动装配,且必须有一个Bean候选者注入,
如果允许出现0个Bean候选者需要设置属性“required=false”,
“required”属性含义和@Required一样,只是@Required只适用于基于XML配置的setter注入方式

2、@Required:依赖检查
@Required只能放置在setter方法上,且通过XML配置的setter注入
使用方法:
public class TestBean {
private String message;
@Required
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
beans-xml:
<bean id="testBean" class="xx.TestBean">
<property name="message" ref="message"/> <!--setter注入-->
</bean>
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="hello"/><!--构造赋值-->
</bean>
注意事项:
配合xml的setter注入方式一起使用。

3、@Value:注入SpEL表达式;
1、可以在类字段上使用该注解:
@Value(value = "#{message}")
private String message;

2、可以放置在带@Autowired注解的方法的参数上:
@Autowired
public void initMessage(@Value(value = "#{ T(java.lang.Math).random() * 100.0 }") String message) {
this.message = message;
}

3、还可以放置在带@Autowired注解的构造器的参数上:
@Autowired
private xx(@Value(value = "#{message}#{message}") String message) { 
this.message = message; 
}
4、@Qualifier:限定描述符,用于细粒度选择候选者;
使用方法:
结合@Autowired 一起使用


(1)、根据基于XML配置中的<qualifier>标签指定的名字进行注入,使用如下方式指定名称

<bean id="X" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<qualifier  type="org.springframework.beans.factory.annotation.Qualifier"  value="限定标识符"/>
</bean>
class X{
  public void initDataSource(@Qualifier("限定标识符") DataSource dataSource) {  
   this.dataSource = dataSource;  
}  
}

使用<qualifier>标签指定的限定标识符只能被@Qualifier使用,不能作为Bean的标识符,
如“ctx.getBean("限定标识符")”是获取不到Bean的。

(2)、缺省的根据Bean名字注入:最基本方式,是在Bean上没有指定<qualifier>标签时一种容错机制,即缺省情况下使用Bean标识符注入,但如果你指定了<qualifier>标签将不会发生容错。
默认情况下(没指定<qualifier>标签)@Qualifier的value属性将匹配Bean 标识符。


(3)、扩展@Qualifier限定描述符注解部分(有兴趣请自己深入):
定义:
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface DataSourceType {
String ip();      //指定ip,用于多数据源情况
DataBase database();//指定数据库类型
}

使用:
@Autowired
public void initDataSource(
@DataSourceType(ip="localhost", database=DataBase.MYSQL)
DataSource mysqlDataSource,
@DataSourceType(ip="localhost", database=DataBase.ORACLE)
DataSource oracleDataSource) {
this.mysqlDataSource = mysqlDataSource;
this.oracleDataSource = oracleDataSource;
}


2.初始化bean部分:

1,@Component
@Component是一个一般的注释。用于一般的类。
@Repository,@Service,@Controller是特殊的预定义的注释。
2,@Repository
用于数据访问组件,即Dao
@Repository ("xxDao")
 
3,@Service
用于业务逻辑组件。
@Service("xxService")

4,@Controller
用于控制类组件。即Action
@Controller
public class MyController{...}


5,配合的注解@Scope("prototype"),@Scope("session")使用




JSR-250注解:

1、@Resource:自动装配
默认byName,找不到会退而使用 byType 继续匹配。
使用方法:   
@Resource(name = "标识符",[type=""])
字段或setter方法
@Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;


使用@Resource需要注意以下几点:
1. @Resource注解应该只用于setter方法注入,不能提供如@Autowired多参数方法注入;
2. @Resource在没有指定name属性的情况下首先将根据setter方法对于的字段名查找资源,如果找不到再根据类型查找;
3. @Resource首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,因此如果JNDI环境中有和Spring容器同名的资源时需要注意。

2、@PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义
相当于xml里面配置的init-method,destory-method属性
但具有更高优先级,即注解方式的初始化和销毁方法将先执行。


JSR-330注解:

1、@Inject:等价于默认的@Autowired,只是没有required属性;

        2、@Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况;

        3、@Qualifier:只对应于Spring自带@Qualifier中的扩展@Qualifier限定描述符注解,即只能扩展使用,没有value属性。



JPA注解:

1.用于注入EntityManagerFactory和EntityManager。






在spring中一些常见的省略的配置:
1. <context:annotation-config />
作用是隐式地向 Spring 容器注册
CommonAnnotationBeanPostProcessor、
AutowiredAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor、
RequiredAnnotationBeanPostProcessor 这4个BeanPostProcessor.

例如:

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor。

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。
传统声明方式如下:<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。同样,传统的声明方式如下:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>



2.<context:spring-configured/>

Spring 可以为IOC容器里的bean进行依赖注入,但如果某些类,没有配置在IOC里,比如一些Domain Object,是否也可以依赖注入?答案是肯定的。
以User 为例,该User并没有配置在IOC里,但我想对其里面的一个UserDao进行依赖注入,其代码如下:
@Configurable(autowire = Autowire.BY_NAME, dependencyCheck = false)
public class User {
  private String UserName;
  ....
  private  UserDao userDao; 

  ... 

  @Autowired/@Bean
  public void setUserDao〔UserDao userDao〕{
this.userDao=userDao.
  }
}
然后再在XML文件里加上 就可以了。
主要是通过Spring管理AnnotationBeanConfigurerAspect切面, 具体的工作由该切面完成。

3.<context:property-placeholder location="classpath:config/mybatis/jdbc.properties,classpath:config/others/config.properties" />

以前使用的方式:
<!-- PropertyPlaceholderConfigurer,用于spring ${placeholder}的解析 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="properties">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!-- 标准配置 -->
<value>classpath:config/others/config.properties</value>
<value>classpath:config/mybatis/jdbc.properties</value>
</list>
</property>
</bean>
</property>
</bean>


4.<context:component-scan base-package="example" use-default-filters="false">
<context:include-filter type="aspectj" expression="example..Stub*"/>
<context:exclude-filter type="annotation" expression="example.Mock"/>
</context:component-scan>



spring mvc 部分省略的配置:
mvc:annotation-driven
mvc:interceptors
mvc:view-controller
mvc:resources
mvc:default-servlet-handler



//以上资料供不时之需









分享到:
评论

相关推荐

    spring3零配置注解实现Bean定义(包括JSR-250、JSR-330)

    本文将详细介绍如何利用Spring3提供的注解特性实现Bean的定义,并重点探讨JSR-250和JSR-330这两种注解标准的应用。 #### Spring3中Bean的零配置注解定义 Spring3提供了一种无需XML配置即可完成Bean定义的方法,即...

    Spring IOC之 使用JSR 330标准注解.docx

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计模式,它允许容器管理对象的生命周期和依赖关系。自Spring 3.0版本起,Spring开始...开发者可以根据项目需求灵活选择使用Spring注解还是JSR 330注解。

    spring4采用JSR349标准校验数据

    当在方法参数上使用`@Validated`并配合JSR 349的注解时,Spring会自动执行验证,并在验证失败时抛出异常。 除了基本的注解,JSR 349还允许创建自定义的验证注解和对应的约束定义。这使得开发者可以扩展验证功能,以...

    Spring注解注入属性

    2. **`@Resource`**:这是一个由JSR-250标准定义的注解,不仅被Spring支持,也被其他许多框架所支持。`@Resource`注解默认按照名称装配依赖,如果找不到与名称匹配的bean,则会退而求其次,尝试按类型装配。这意味着...

    jsr250-api-1.0源码

    另一方面,jsr250-api-1.0.jar 文件则包含了编译后的API类,供开发人员在项目中引用使用。通过导入这个jar包,开发者可以在自己的项目中直接使用JSR 250定义的注解,而无需关心其实现细节。 在实际开发中,JSR 250 ...

    spring中注解的实现原理

    对于依赖注入,Spring通过AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor来处理`@Autowired`和JSR-330的`@Inject`注解。这些处理器在bean初始化之后、初始化之前进行工作,寻找依赖并...

    spring注解注入示例详解.pdf

    @PostConstruct是一个在JSR-250中定义的注解,它的作用是在Bean被初始化之后执行某些操作。这些操作通常是指Bean生命周期中的初始化之后阶段,即实例化Bean之后,以及装配Bean的属性之后。 使用@PostConstruct注解...

    spring3注解详细

    @Resource 是 JSR-250 标准注解,推荐使用它来替代 Spring 专有的 @Autowired。@Resource 默认按照 Bean 的名字(byName)进行注入,而 @Autowired 默认按照类型(byType)进行注入。@Resource 的 name 和 type 属性可以...

    spring注解使用详解

    - `@Resource`:类似于`@Autowired`,但主要针对JSR-250规范,主要用于注入Java EE的资源。 - `@Configuration`和`@Bean`:在Java配置类中声明和定义Bean,可以替代XML配置文件。 ### 5. 结论 Spring的注解配置...

    (转)Spring 3.0 注解注入详解

    除了这些核心注解,Spring还提供了`@Resource`注解,它基于Java标准JSR-250,主要用于注入JSR-250管理的bean。`@Resource`默认按名称注入,而`@Autowired`默认按类型注入。 理解了这些注解后,我们来看看如何在实际...

    Spring注解收集1

    - **定义**:`@Resource`注解也是用于自动装配bean的,但它来自于J2EE标准,不仅可以在Spring框架中使用,还可以在其他支持JSR-250规范的容器中使用。 - **示例**: ```java @Resource(name = "beanName") ...

    spring使用注解依赖jar

    3. `@Resource`注解:主要用于JSR-250规范中的资源注入,它的行为与`@Autowired`相似,但默认按名称匹配而非类型。在处理JSR-250规范的场景下,`@Resource`更为合适。 除了依赖注入,Spring还提供了一些其他的注解...

    spring 注解注意事项、值的接受传递不同方式

    7. 配合JSR-330标准:Spring支持JSR-330标准的注解,如@Named、@Inject等,这使得Spring与其他遵循该标准的框架更好地集成。 在实际项目中,理解并掌握这些注解的用法和注意事项,能够帮助我们编写出更加灵活、可...

    spring注解说明文档

    本篇将深入探讨Spring注解的使用,特别是如何使用注解来注入属性。 在传统的Spring配置中,如1.1.章节所示,我们需要在XML配置文件中定义每个Bean,并通过`&lt;property&gt;`标签指定依赖关系。这种方式虽然直观,但当...

    23 Spring Core参数校验之JSR303_JSR-349注解-慕课专栏1

    Spring Core提供了一种优雅的方式来处理参数校验,特别是通过JSR 303、JSR 349和JSR 380这些标准注解,实现了高效且易于维护的验证机制。 JSR 303最初定义了JavaBean验证的标准,而JSR 349是其修订版,主要增加了对...

    spring注解大全整理.docx

    * @Resource:JSR-250 提供的注解,用于资源注入 * @Inject:JSR-330 提供的注解,用于依赖注入 三、切面编程 * @Aspect:声明一个切面(就是说这是一个额外功能) * @After:后置建言(advice),在原方法前执行 ...

    Spring注解开发视频教程

    它适用于JSR-250规范,可以注入字段和方法。 6. `@PostConstruct` 和 `@PreDestroy`:分别标记初始化和销毁方法,当bean创建后和销毁前调用。 7. `@Configuration` 和 `@Bean`:这两个注解一起使用可以替代传统的...

    spring mvc+ibatis+spring注解

    总之,这个项目展示了如何结合Spring MVC、Ibatis以及Spring注解,构建一个完整的Web应用程序,实现了数据的CRUD操作,以及分页排序查询和用户登录验证等功能,所有这些都基于非XML的配置方式,利用注解提高了开发...

    spring-security注解开发

    5. **@RolesAllowed**:这个注解源自JSR-250,与@Secured类似,它用于限制只有具有指定角色的用户才能访问。但请注意,JSR-250的功能相对较弱,不支持复杂的表达式。 6. **@Autowired** 和 **@Qualifier**:在配置...

Global site tag (gtag.js) - Google Analytics