使用注解配置spring如@Compnent、@Service、@Consroller、@scope和@value的使用

本文详细介绍了如何在Spring框架中使用注解进行配置,包括基本的@Component、@Service及@Controller等注解的应用,以及如何设置对象作用域、依赖注入、初始化和销毁方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤

1.导包4+2+spring-aop

如图:为学习到该阶段需要用到的包(里面的aop+test是spring和junit整合测试的时候用到的)

2.为主配置文件引入新的命名空间(约束)




3.开启使用注解代理配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">

<!-- 指定扫描cn.itcast.bean报下的所有类中的注解.
	 注意:扫描包时.会扫描指定报下的所有子孙包
 -->
<context:component-scan base-package="cn.itcast.bean"></context:component-scan>

</beans>

在类中使用注解完成配置

  1. 将对象注册到容器
@Component("user")
	@Service("user") // service层
	@Controller("user") // web层
他们三个只是名字不同都实现了把user添加到组件中,区别只是通过名称可以知道该逻辑是在哪一个层次中

2.修改对象的作用范围

@Scope(scopeName="singleton|prototype"


3.值类型注入

在声明是变量前面注入内容
	@Value("18")
	private Integer age;

通过反射的Field赋值,破坏了封装性
在声明set方法前注入内容
	@Value("玛莎拉蒂")
	public void setName(String name) {
		this.name = name;
	}


4.引用类型注入

	@Autowired
	private Car car;
自动装配
问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象
手动装配
@Resource(name="car")//手动注入,指定注入哪个名称的对象

5.初始化|销毁方法

	@PostConstruct //在对象被创建后调用.init-method
	public void init(){
		System.out.println("我是初始化方法!");
	}
	@PreDestroy //在销毁之前调用.destory-method
	public void destory(){
		System.out.println("我是销毁方法!");
	}


<think>好的,我现在需要帮助用户在Spring框架中创建使用自定义注解@Component@Prototype。首先,我应该回顾一下Spring中现有的注解机制,特别是@Component相关的作用域注解,比如@Scope("prototype")。用户可能想要自定义类似功能的注解,比如简化原型作用域的声明。 根据用户提供的引用内容,引用[2]提到component-scan会自动扫描带有@Component、@Repository、@Service、@Controller的类,这说明这些注解本质上是带有元注解的,可能被@Component标记。而引用[3]指出@Component的三个衍生注解分别用于不同层,这说明自定义注解可能需要使用注解,比如@Controller本身可能被@Component修饰。 接下来,用户想创建自定义的@Component注解,可能目的是为了扩展或分类不同的组件类型。不过,在Spring中,标准的@Component已经是最基础的注解,其他如@Repository等都是它的派生。所以,用户的自定义@Component可能需要继承@Component的功能,比如使用注解的方式。 然后是@Prototype注解,标准的Spring作用域是通过@Scope("prototype")来定义的,用户可能希望创建一个简化的注解,比如@Prototype,来替代每次写@Scope。这需要用到元注解,将@Scope可能的其他配置结合起来。 接下来,我需要考虑如何创建这两个注解。对于自定义@Component,可能需要用@Component作为元注解,这样被自定义注解标记的类会被组件扫描到。例如,创建一个@MyComponent,它本身用@Component修饰,这样Spring会识别它。但用户直接提到的是自定义@Component,可能需要确认是否要替换原有的,但通常不建议,而是创建新的注解。 对于@Prototype,需要创建自定义注解使用@Scope("prototype")@Bean或者其他相关的元注解。可能需要使用@Scope,并设置proxyMode,尤其是在需要代理的情况下,比如ScopedProxyMode.TARGET_CLASS。 然后,用户需要如何让Spring识别这些自定义注解。根据引用[2],component-scan默认会扫描@Component及其衍生注解,所以如果自定义注解用@Component作为元注解,它们会被自动扫描。而作用域注解可能需要额外的配置,或者直接在自定义注解中包含@Scope。 还需要考虑如何测试这些自定义注解,比如创建一个使用@MyComponent@Prototype的类,并验证它们是否被正确注册作用域是否为原型。 可能遇到的问题包括:是否正确应用了元注解,组件扫描是否配置正确,作用域是否生效等。需要确保在配置类中启用了组件扫描,或者通过XML配置,如引用[2]中的component-scan标签。 现在,我需要将这些思路整理成步骤,并确保示例代码正确。例如,自定义@Component可以使用注解@Component,而@Prototype则组合@Scope可能的其他配置。同时,要提醒用户需要在Spring配置中启用组件扫描,指向正确的包路径。 最后,生成相关问题,帮助用户进一步理解相关知识点,比如元注解的作用、组件扫描机制、作用域配置等。</think>### 如何在Spring中创建使用自定义注解 `@Component` `@Prototype` #### 1. **理解Spring注解机制** 在Spring中,`@Component` 是通用注解,用于标记类为可被组件扫描的Bean。其衍生注解(如 `@Service`、`@Repository`)通过元注解 `@Component` 实现功能继承[^3]。 作用域注解(如单例 `@Scope("singleton")` 或原型 `@Scope("prototype")`)用于定义Bean的生命周期[^2]。 #### 2. **创建自定义 `@Component` 注解** 目标:创建一个自定义注解 `@MyComponent`,功能等同于 `@Component`,但用于特定场景(如分层模块化)。 实现步骤: ```java import org.springframework.stereotype.Component; import java.lang.annotation.*; @Target(ElementType.TYPE) // 仅用于类 @Retention(RetentionPolicy.RUNTIME) // 运行时生效 @Component // 继承@Component的组件扫描能力 public @interface MyComponent { String value() default ""; // 支持Bean名称定义 } ``` - **说明**:通过元注解 `@Component`,Spring会将 `@MyComponent` 标记的类识别为Bean[^3]。 #### 3. **创建自定义 `@Prototype` 注解** 目标:创建一个注解 `@Prototype`,等价于 `@Scope("prototype")`,简化原型作用域声明。 实现步骤: ```java import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import java.lang.annotation.*; @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Scope("prototype") // 定义作用域为原型 public @interface Prototype { ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; // 可选代理配置 } ``` - **说明**:`@Scope("prototype")` 表示每次注入时创建新实例,`proxyMode` 用于解决作用域代理问题。 #### 4. **使用自定义注解** 示例:定义一个原型作用域的Bean,并使用 `@MyComponent` 标记。 ```java @MyComponent @Prototype public class CustomService { // 类实现 } ``` - **验证**:在Spring上下文中,`CustomService` 的实例每次注入时均为新对象。 #### 5. **配置组件扫描** 确保Spring扫描包含自定义注解的包: ```xml <!-- XML配置方式 --> <context:component-scan base-package="com.example.custom.annotations"/> ``` 或通过Java配置类: ```java @Configuration @ComponentScan("com.example.custom.annotations") public class AppConfig {} ``` - **关键点**:组件扫描会识别所有 `@Component` 衍生注解(包括 `@MyComponent`)。 #### 6. **注意事项** - **元注解继承**:自定义注解需通过元注解继承Spring原生功能。 - **作用域代理**:原型Bean在依赖注入时需考虑代理模式(如 `proxyMode` 配置)。 - **注解冲突**:避免Spring原生注解功能重复。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值