使用java的方式配置spring
声明
本文为其他博主原创文章整合,仅用作个人学习,特此声明
参考文章链接
(3条消息) B站 - 狂神 - Spring5课堂笔记_夜里的雨的博客-CSDN博客_狂神spring5笔记
Spring:IOC本质分析探究 - 百度文库 (baidu.com)
使用Java的方式配置Spring
不使用Spring的xml配置,完全交给java来做!
Spring的一个子项目,在spring4之后,它成为了核心功能
实体类:pojo文件夹下的的User.java
//这里这个注解的意思,就是说明这个类被Spring接管了,注册到了容器中
//这里的Component注解配合@ComponentScan注解使用
@Component
public class User {
private String name;
public String getName() {
return name;
}
//给属性注入值
@value("xy')
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "user{" +
"name='" + name + '\''+
'}';
}
}
要么使用@Bean,要么使用@Component和@ComponentScan,两种效果一样
配置类:config文件夹下的XyConfig.java
//@Configuration表示这是一个配置类,就像我们之前看的beans.xml,类似于<beans>标签
@Configuration //这个也会被Spring容器托管,注册到容器中,因为他本来就是一个@Component
@componentScan("com.xy.pojo") //开启扫描,不加这个扫描也可以是因为在这个类里面加了@Bean注解,已经把这个注入到spring了,不需要通过扫描了。扫描是配合@Component使用的,在User类上面加入了这个注解
//@Import(XyConfig.class)
public class XyConfig {
//注册一个bean , 就相当于我们之前写的一个bean 标签
//这个方法的名字,就相当于bean 标签中的 id 属性 ->getUser
//这个方法的返同值,就相当于bean 标签中的class 属性 ->User
//@Bean
public User getUser(){
return new User(); //就是返回要注入到bean的对象!
}
}
测试类
public class MyTest {
public static void main(String[ ] args) {
//如果完全使用了配置类方式去做,我们就只能通过 Annotationconfig 上下文来获取容器,通过配置类的class对象加载!
ApplicationContext context = new AnnotationConfigApplicationContext(XyConfig.Class); //class对象
User getUser =(User)context.getBean("getUser"); //方法名getUser,这里用user也可以
System.out.Println(getUser.getName());
}
}
测试的过程中发现了一个问题
会创建两个相同对象
User getUser =(User)context.getBean("getUser"); //方法名getUser,这里用user也可以
这是为什么呢?
弹幕总结 - -> @Bean是相当于< bean>标签创建的对象,而我们之前学的@Component是通过spring自动创建的这个被注解声明的对象,所以这里相当于有两个User对象被创建了。
此时容器中有两个User对象,一个id为getUser,另一个id为user,现在之所以user也能取到对象,是因为加了自动装配注解@ComponentScan("xxx")。相当于一个对象有了两个别名getUser和user
一个是bean标签创建的(@Bean),一个是通过扫描然后使用@Component,spring自动创建的User对象
使用@Bean的话 bean的id就是标注的方法名,可以在使用@Bean(name="")来设置id
所以这里去掉@Bean这些东西,然后开启扫描。之后在User头上用@Component即可达到spring自动创建User对象了
需要注意以下几点
@Configuration 也会被Spring容器托管,注册到容器中,因为他本来就是一个@Component
1.如果开启包扫描,加载配置类以后就可以通过反射拿到配置类中的对象了,
2.@Bean只写在方法上,返回的是一个对象,但一般不获取已经在容器中的对象
3.@Bean 可以用于通过方法获取数据库连接池Connection这种对象
4.getBean方法中Bean的名称就是带@Bean注解的方法的方法名
5.要么使用@Bean,要么使用@Component和@ComponentScan,两种效果一样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?