使用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注解的方法的方法名

image-20220613183726386

5.要么使用@Bean,要么使用@Component和@ComponentScan,两种效果一样

posted @ 2022-06-13 19:04  无关风月7707  阅读(97)  评论(0编辑  收藏  举报