spring常用注解使用解析

spring没有采用约定优于配置的策略,spring要求显示指定搜索哪些路径下的Java文件。spring将会把合适的java类全部注册成spring Bean。

问题:spring怎么知道把哪些Java类当初bean类处理?

这就需要使用annotation,spring使用一些特殊的annotation来标注bean类。

@Component:标准一个普通的spring Bean类。

@Controller:标注一个控制器组件类。

@Service:标注一个业务逻辑组件类。

@Repository:标注一个DAO组件类。

Bean实例的名称默认是Bean类的首字母小写,其他部分不变。

在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。尽量考虑使用@Controller,@Service,@Repository代替通用的@Component。

指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,此时需要在spring配置文件中导入context Schema,并指定一个简单的搜索路径。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan
base-package="org.crazyit.app.service"/>
</beans>

我们可以通过为<context:component-scan>添加<include-filter...>或<exclude-filter...>子元素来指定spring bean类,只要位于指定路径下的java类满足这种规则,即使这些java类没有使用任何annotation标注,spring一样会将他们当初bean类来处理。

<include-filter...>:满足该规则的java类会被当初bean类处理。

<exclude-filter...>:指定满足该规则的java类不会被当初bean类处理。

这两个子元素有两个属性:

type:指定过滤器类型。

expression:指定过滤器所需要的表达式。

spring内建支持如下四种过滤器:

annotation:该过滤器要指定一个annotation名,如lee.AnnotationTest。

assignable:类名过滤器,该过滤器直接指定一个java类。

regex:正则表达式过滤器,该过滤器指定一个正则表达式,匹配该正则表达式的java类将满足该过滤规则,如org\.example\.default.*。

aspectj:如org.example..*service+。

<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan
base-package="org.crazyit.app.service">
<!-- 只将以Chinese、Axe结尾的类当成Spring容器中的Bean -->
<context:include-filter type="regex"
expression=".*Chinese"/>
<context:include-filter type="regex"
expression=".*Axe"/>
</context:component-scan>

@Resource位于java.annotation包下,来自于java EE规范的一个annotation。使用该annotation为目标bean指定协作者Bean。

@Resource详细用法见经典javaEE企业应用实战。

@Resource有一个name属性,在默认情况下,spring将这个值解释为需要被注入的Bean实例的名字。

 

@Controller
public class demo {
@Resource(name="user")
private User user;
@Resource(name="user")
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
}

@Resource也可以直接修饰Filed,

如果@Resource修饰Field,这时候连该属性的setter方法就不需要了。

使用@Resource可以省略name属性。

修饰方法时,省略name属性,则该name值是该setter方法去掉前面的set字符串,首字母小写后得到的子串。

修饰Field时,省略name属性,则该name与该Field同名。

指定Bean实例的作用域。

@Scope:注解也可以指定Bean实例的作用域。

@Controller("demo")
@Scope("prototype")
public class demo {

}

作用范围就那4中填写,不知道的等我博客,最近在回顾spring知识。

@PostConstruct和@PreDestory位于java.annotation包下。

在spring中用于定制spring容器中bean的生命周期行为。

@PostConstruct修饰的方法是bean的初始化之前的方法。

@PreDestory修饰的方法是bean销毁之前的方法。

深刻理解该类使用了@PostConstruct修饰init方法,那么spring就会在该bean的依赖关系注入完成之后回调该方法。

@Component
public class SteelAxe
{
public SteelAxe()
{
System.out.println("创建SteelAxe类对象实例...");
}
}
 

demo1:

@Component
public class Chinese
{
// 执行Field注入
@Resource(name="steelAxe")
private SteelAxe steeAxe;

public Chinese() {
    super();
System.out.println("创建Chinese类对象实例...");
}
@PostConstruct
public void init()
{
System.out.println("正在执行初始化的init方法...");
}
@PreDestroy
public void close()
{
System.out.println("正在执行销毁之前的close方法...");
}
}

// 创建Spring容器
AbstractApplicationContext ctx = new
ClassPathXmlApplicationContext("beans.xml");
// 注册关闭钩子
ctx.registerShutdownHook();

打印:

创建Chinese类对象实例...

创建SteelAxe类对象实例...

正在执行初始化的init方法...

正在执行销毁之前的close方法...

如果注释掉chinese的依赖注入,那么结果如下:

@Component
public class Chinese
{
// 执行Field注入
//@Resource(name="steelAxe")
//private SteelAxe steeAxe;
public Chinese() {
super();
System.out.println("创建Chinese类对象实例...");
}
@PostConstruct
public void init()
{
System.out.println("正在执行初始化的init方法...");
}
@PreDestroy
public void close()
{
System.out.println("正在执行销毁之前的close方法...");
}
}

打印:

创建Chinese类对象实例...

正在执行初始化的init方法...

创建SteelAxe类对象实例...

正在执行销毁之前的close方法.

时间: 2024-10-06 00:09:15

spring常用注解使用解析的相关文章

spring常用注解使用讲解

spring常用注解使用讲解 本文讲述spring的几个常用的注解 @RequestMapping @RequestParam @ResponseBody @RequestBody @Autowired 一.@RequestMapping  RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: v

Spring常用注解总结

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低.2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率.为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密

Spring学习(2)Spring 常用注解

Spring 常用注解 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scanbase-package="pagkage1[,pagkage2,-,pagkageN]"/>. 如:在base-package指明一个包 1 <context:component-scan base-package="cn.gacl.java"/> 表

Spring系列之Spring常用注解总结

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低.2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率.为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密

Spring 常用注解解析

1. 常用注解 1.1 @Configuration @Configuration public class MainConfig { } @Configuration注解表明这个类是一个配置类,该类中应该包含如何在Spring应用上下文中创建bean的细节 1.2 @ComponentScan @Configuration @ComponentScan("per.ym") public class MainConfig { } @ComponentScan注解用于启用组件扫描,其作用

Spring常用注解,自动扫描装配Bean

1 引入context命名空间(在Spring的配置文件中),配置文件如下: Xml代码   xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 打开配置 <context:comp

spring常用注解(转载http://elf8848.iteye.com/blog/442806)

1 引入context命名空间(在Spring的配置文件中),配置文件如下: Xml代码   xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 打开配置 <context:comp

Spring框架系列(七)--Spring常用注解

Spring部分: 1.声明bean的注解: @Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) @Controller:在展现层使用,控制器的声明(Controller) 2.注入bean的注解: @Autowired:由Spring提供,按类型注入,如果一个接口有多个实现,需要和@Qualifier配合使用 @Inject:由JSR-330提供 @Resource:由JSR-250提供,按名

spring学习笔记四:spring常用注解总结

使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.xxx" /> 1.定义Bean @Component 需要在类上面使用注解@Component,改注解的vlan属性用于指定改注解的ID的值 spring还提供三个功能基本和@Component等效的注解 @Repository 用于对DAO实现类进行注解 @Service