@Component
- 标记一个类,将这个类交给
Spring
管理
- 相当于在配置文件当中配置的
<bean id="" class="">
- @Component的三个衍生注解
- @Controller:web层
- @Service:service层
- @Repository:dao层
- 为了更好的进行
分层
,可以使用 Spring 其它三个注解,功能都是类似的
- 目前使用哪一个注解功能都一样, 后期可能会在每一个注解中添加一些属于各自的属性
属性注入
@Value

/**
* @author: BNTang
**/
@Component("user")
public class User {
@Value("BNTang")
private String name;
public void say() {
System.out.println("name = " + name);
}
}
@Autowired
- 设置
对象类型
的属性值
- 直接使用这个注解,是按照
类型
完成的属性注入
- 不需要在注解上指定
id名称
/**
* @author: BNTang
**/
@Component("user")
public class User {
@Autowired
private Dog dog;
@Override
public String toString() {
return "User{" +
"dog=" + dog +
'}';
}
}
/**
* @author: BNTang
**/
@Component("dog")
public class Dog {
@Value("旺财")
private String name;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}

/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void Demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
}
- 如果习惯是按照名称来完成属性注入的,意思是说指定
id的名称
来进行属性注入
- @Autowired 注解必须与
@Qualifier
一起使用才可以
/**
* @author: BNTang
**/
@Component("user")
public class User {
@Autowired
@Qualifier("dog")
private Dog dog;
...
}

@Resource
- 这个注解也是设置
对象类型
的属性值
- 是按照
name
来进行属性注入的
- 如果你使用上面的两个注解联合,你其实可以使用当前这个注解来进行注入
- 一个注解代替两个,需要
JDK8
/**
* @author: BNTang
**/
@Controller("user")
public class User {
@Resource(name = "dog")
private Dog dog;
}

- 给
User
类添加一个 toString 即可看到 Dog
类的 name 值
- 测试类代码同上
@PostConstruct
- 可以使用该注解,来指定对象在初始化的时候执行的方法
- 修改
User
类,修改之后代码如下:
/**
* @author: BNTang
**/
@Component("user")
public class User {
@PostConstruct
public void init(){
System.out.println("init bean success");
}
}
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void Demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
}
}
@PreDestroy
- 在对象被销毁的时候,指定需要执行的方法
- 也就是在对象销毁之前需要执行什么东西,做什么事情
- 修改
User
类,代码如下:
/**
* @author: BNTang
**/
@Component("user")
public class User {
@PreDestroy
public void destroy(){
System.out.println("bean destroy success");
}
}
- 测试类代码如下
- 至于为什么是下面的方式进行测试我前面已经讲解过了不懂的回去看看即可
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void Demo() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
applicationContext.close();
}
}
@scope
- 指定 Bean 的作用范围
- 其实是用来指定 Bean 的创建方式
- 是单例还是多例的方式等等 …

/**
* @author: BNTang
**/
@Component("user")
@Scope("singleton")
public class User {
}
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void Demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
User userTwo = (User) applicationContext.getBean("user");
System.out.println(user);
System.out.println(userTwo);
}
}
top.it6666.domain.User@16e7dcfd
top.it6666.domain.User@16e7dcfd
/**
* @author: BNTang
**/
@Component("user")
@Scope("prototype")
public class User {
}
top.it6666.domain.User@16e7dcfd
top.it6666.domain.User@3d121db3
- 其实这些注解是简化了我们之前讲解的 xml 形式的配置
- 作用可以参考之前的文章
XML与注解比较
- XML 可以适用,
任何场景
- 结构清晰,
维护方便
- 注解不是自己提供的类使用不了,也就是自己创建的类
开发简单方便
XML与注解一起使用
- XML 管理 Bean
- 注解完成属性注入
- 使用过程中,可以不用扫描,扫描是为了让类上的注解生效,也就是扫描 Bean 交给 Spring 进行管理
- 在没有扫描的情况下,使用
@Resource
、@Value
、@Autowired
、@Qulifier
,这些注解
- 只需要在 XML 中添加一个注解的支持即可
<context:annotation-config/>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具