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方法...
相关推荐
本文将深入探讨Spring框架中的一些常用注解,并通过实例来解析它们的工作原理。 1. `@Component`: 这是Spring中的基础组件注解,它标记一个类为Spring容器管理的bean。当你在类上使用`@Component`时,Spring会自动...
**Spring Boot 常用注解详解** Spring Boot以其简洁的配置、快速的启动和集成众多优秀框架的能力,成为Java开发领域中的热门选择。在Spring Boot应用中,注解起着至关重要的作用,它们简化了配置,使得代码更加简洁...
【Spring Boot常用注解说明】 在Spring Boot框架中,注解起到了至关重要的作用,它们简化了配置,使得开发过程更加高效。以下是一些常见的Spring Boot注解及其详细解释: 1. **@SpringBootApplication** 这是...
总结一下,基于注解的文件上传是Spring MVC中处理文件上传的一种常用方式,通过`@RequestParam`或`@RequestPart`捕获文件数据,配合MultipartResolver进行文件解析和存储。理解并熟练运用这些知识点,可以有效地提高...
Spring常用配置及解析类说明 Spring Framework是当前最流行的Java EE应用程序框架之一,它提供了强大的配置机制,允许开发者灵活地配置应用程序。春天的配置机制是基于XML文件的,它提供了多种配置方式,包括基于...
n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级特性-自定义TypeFilter n 高级特性-ImportSelector和ImportBeanDefinitionRegistrar的分析 n 高级特性-自定义ImportSelector n ...
二、常用注解 1. **@Controller**:此注解标识一个类作为Spring MVC的控制器,它定义了处理HTTP请求的核心组件。 2. **@RequestMapping**: - 类级注解:用于控制器类,定义类级别的URL映射,可以作为所有方法的...
- **常用注解**: - **@Component/@Repository/@Service/@Controller**:用于标注组件类。 - **@Autowired**:自动装配Bean。 - **@Resource**:与@Autowired类似,但更加灵活。 - **@PostConstruct/@PreDestroy...
使用`@Configuration`注解的类被视为Spring容器的配置类。 - **@Bean**:可以理解为Spring中的`<bean>`标签,用于定义一个具体的Bean。 结合使用`@Configuration`和`@Bean`可以有效地管理Spring容器中的Bean,例如...
Spring MVC、iBatis 和 Spring 注解是Java开发中常用的技术栈,它们分别负责Web层、数据访问层和依赖注入及配置。这篇文章将详细介绍这三个组件的结合使用以及相关的知识点。 **Spring MVC** Spring MVC 是 Spring ...
本篇文章将深入探讨Spring MVC Controller层中的常用注解,帮助开发者更好地理解和运用这些注解来构建高效、可维护的Web应用。 1. `@Controller`:这是最基本的注解,表明一个类是Spring MVC的Controller。它通常...
9. `classmate.jar`:用于处理类型信息,帮助Spring解析注解。 确保这些jar包在项目类路径中是必不可少的,因为它们提供了Spring注解方式所需的全部支持。在实际开发中,通常通过Maven或Gradle等构建工具来管理这些...
本文将深入解析Spring中最常用的七大注解:`@Required`、`@Autowired`、`@Qualifier`、`@Configuration`、`@ComponentScan`、`@Lazy`和`@Value`,以及它们在实际开发中的应用。 1. **@Required** `@Required`注解...
为了使用Spring注解功能,首先需要确保项目中有正确的jar包。以下是必需的jar包列表: - `spring.jar`:Spring框架的核心库。 - `commons-logging.jar`:用于日志记录的支持库。 - `log4j-1.2.15.jar`:一个可选的...
在Spring和SpringMVC中,注解的使用大大简化了配置,提高了代码的可读性和可维护性。下面我们将详细讲解一些常用的注解。 1. **@Configuration 和 @ComponentScan** - `@Configuration`:这是一个核心注解,用于...
这个"spring常用架包"集合了Spring框架中常用的核心组件,方便开发者在项目中快速引用。以下是对这些核心组件及其功能的详细介绍: 1. **Spring Core**:这是Spring框架的基础,提供依赖注入(Dependency Injection...
这个"Spring常用的jar包.rar"文件包含了一系列Spring框架的核心组件和依赖,使得开发者能够快速搭建一个基于Spring的项目环境。以下是对这些jar包及其重要性的详细解释: 1. **spring-core.jar**:这是Spring框架的...
6. **条件注解(Conditional Annotation)**:Spring Boot使用`@Conditional`系列注解来决定哪些配置类或Bean应该在特定条件下生效。例如,`@ConditionalOnClass`和`@ConditionalOnProperty`。 7. **YAML与...
Spring框架是Java开发中最常用的轻量级开源框架之一,它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力而著名。Spring框架的设计理念是使应用程序的组件化...