Spring框架学习之Spring @Autowired实现自动装配的代码

网友投稿 246 2022-09-05


Spring框架学习之Spring @Autowired实现自动装配的代码

学习自动装配之前,讲一个概念:Component,即组件。组件你也可以理解为bean对象,只不过通常Component的组成会稍微复杂一些,比如,一个组件里面会引用一个或多个别的bean对象,组件的定义方式也不一样。自动装配貌似就是为组件而生的。

自动装配(Autowired)这个概念,如果你已经使用过SpringMVC或者SpringBoot做开发,你会发现@Autowired注解是特别经常使用到的。比如你的Controller、Service相关的类里面就会经常用到。如果你看过@Controller或者@Service的定义,你会发现这两个注解也是使用了@Component注解的,就是说这两个注解也是Component。

自动装配就是说,你不用手动实现bean之间的组合关系,只要使用了@Autowired注解,程序就会自动的注入这个需要的bean,前提是你的Spring容器有这个bean。我们来看个例子。

这个例子是这么回事,我定义了一个Car接口,里面有一个run()方法,然后我定义了一个BaoMaCar,实现了Car接口,然后我定义了一个Test.java类,我在BaoMaCar和Test上使用了@Component注解,表明我这两个类需要创建由Spring管理的bean对象,有点绕,这么说会更好理解:使用了@Component之后,Spring会使用这两个类创建出相应的bean对象,并放到容器中。还有一个MyConfig.java类,上面使用了@Configuration和@ComponentScan注解,这个类是一个Spring配置类,如果你没有看过我的上一篇文章,建议你看一下,上篇文章介绍了使用Java配置Spring的方式。因为我要启动Spring上下文就是需要这个配置类,同时我也需要让Spring发现这些我声明的Component,所以还需要使用@Component注解(中文意思:组件扫描),参数是当前的包,默认就扫描当前package下的所有类,看看哪个类上面使用@Component注解就把哪个类交由Spring管理。直接看代码吧!

package demo2;

public interface Car {

void move();

}

package demo2;

import org.springframework.stereotype.Component;

@Component

public class BaoMaCar implements Car {

private String driver = "小白开";

public void move() {

System.out.println(driver+"正在开车");

}

}

package demo2;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

@Configuration

@ComponentScan("demo2")

public class MyConfig {

}

package demo2;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.stereotype.Component;

@Component

public class Test {

@Autowired

private Car car;

public Car getCar() {

return car;

}

public static void main(String[] args) {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

Test test = context.getBean(Test.class);

test.getCar().move();

context.close();

}

}

你可能觉得我说半天跟自动配置有什么关系?看一下最后一个类——Test.java,里面用到了@Autowired注解,当我启动main()方法的时候,你猜会发生什么?控制台会打印:“小白正在开车”。是不是觉得好奇怪?这是怎么做到的?听我为你慢慢道来。我从上下文中拿到了一个Test类的对象,我Test类本身就是使用了@Component注解的,所以上下文启动之后容器中就已经创建好了Test的对象。那Test对象的Car car属性怎么会没有报空指针错误呢?没错了,就是在创建Test的对象时,Spring发现这个类的Car car属性使用@Autowired注解,于是就在容器中找实现了Car接口的对象,一番搜索之后,找到了BaoMaCar的对象,于是就把这个对象注入到Test的对象的car属性中了。是不是很厉害?当然了,当容器中有多个实现了Car接口的对象时,这个写法是有问题的,因为Spring知道你需要一个实现了Car接口的对象,但是由于有多个符合这个条件的对象,所以无法实现帮你自动注入,因此会发生异常。解决的办法就好几种。我就不一一列举了,还是那句话,师傅领进门,修行靠个人,你应该自己去探索一下。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Python】删除非空目录的方法shutil.rmtree()以及空目录的方法os.rmdir()
下一篇:【Python】返回匹配特定文件的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~