spring 演变过程
1.spring 中ioc如何控制反转
传统对象创建方式:Book book=new Book();
book.setAuthor("贾平凹");
book.setBookName("平凡的世界");
book.printBookInfo();
spring对象创建方式:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="book" class="com.test.vo.Book">
<property name="bookName" value="《平凡世界》"></property>
<property name="author" value="cc"></property>
</bean>
</beans>
ApplicationContext aContext =new ClassPathXmlApplicationContext("springconfig.xml");
Book bean = aContext.getBean("book",Book.class);
System.out.println(bean.getAuthor());2.spring的组件扫描
(1).在Spring中,组件扫描默认是不启用的,需要显式配置Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。
(2).@ComponentScan默认会扫描与配置类相同的包以及这个包下的所有子包,查找带有@Component注解的类。
@RunWith(SpringRunner.class),会在测试开始的时候自动创建Spring的应用上下文。
@ContextConfiguration(classes = CDPlayerConfig.class)会告诉Spring需要在CDPlayerConfig中加载配置。2.1 组件扫描无法扫描到

2.2 组件扫描能扫描到

3.设置beanID
Spring应用上下文中所有的bean都会给定一个ID,默认情况下,Spring会将类名的第一个字母变为小写,作为该bean的ID。
使用@Component设置bean ID
@Component("lonelyHeartsClub")
public class SgtPeppers implements CompactDisc {
......
}4.设置组件扫描的基础包
按照默认规则 ,@ComponentScan注解会以配置类所在的包作为基础包(base package)来扫描组件。
但有时候,我们会将配置类放在单独的包中,使其与其他的应用代码区分开来。这种场景下,默认的基础包就满足不了需求。
@ComponentScan注解支持传入指定的基础包,有以下几种场景:4.1 指定要扫描的基础包(单个)
@ComponentScan("chapter02")
public class CDPlayerConfig {
}
或者:
@ComponentScan(basePackages = "chapter02")
public class CDPlayerConfig {
}4.2 指定要扫描的基础包(多个)
@ComponentScan(basePackages = {"chapter01", "chapter02"})
public class CDPlayerConfig {
}4.3 指定要扫描的基础包(类型安全)
@ComponentScan(basePackageClasses = {CDPlayer.class})
public class CDPlayerConfig {
}5.为bean添加注解实现自动装配
实现自动装配,需要使用Spring的@Autowired注解。
@Autowired注解也可以替换成@Inject注解(来源于Java依赖注入规范),同样可以实现自动装配,
在Spring项目中建议使用@Autowired注解。
@Autowired一般情况下,有以下3种使用方式:
@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc compactDisc;
//方式一:使用在构造器上
@Autowired
public CDPlayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
//方式二:使用在属性的setter方法上
@Autowired
public void setCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
//方式三:使用在类的任何方法上
@Autowired
public void insertDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
@Override
public void play() {
compactDisc.play();
}
}
注意:
不管是构造器、Setter方法还是其他的方法,Spring都会尝试满足方法参数上所声明的依赖。
情况一:
假如有且只有一个bean匹配依赖需求的话,那么这个bean将会被装配进来。
情况二:
如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。
可以通过设置require属性为false避免该异常出现:
@Autowired(required = false)
public CDPlayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
不过建议谨慎使用,避免未找到bean进行匹配,而且代码没有进行null检查而出现NullPointerException。
情况三:
如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配。6.通过JavaConfig装配bean
我们引用了一个第三方类库,需要将类库中的某个类装配到项目中,不可能在该类上添加@Component注解,因此无法使用自动装配的功能。
Spring中有以下两种方式显式配置bean:
方式一:
通过JavaConfig配置bean
若没有依赖时:
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
}
默认生成的bean ID和方法名一致,即sgtPeppers
@Bean(name = "lonelyHeartsClub")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
复杂的bean存在依赖,比如CDPlayer,它依赖于CompactDisc:
简单的一种方式是,直接使用刚刚定义的sgtPeppers()方法作为CDPlayer构造器的参数依赖:
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
不过更建议的是以下方式,将依赖项作为bean方法的参数,Spring会自动匹配到参数依赖项:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
方式二:
通过xml配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="book" class="com.test.vo.Book">
<property name="bookName" value="《平凡世界》"></property>
<property name="author" value="cc"></property>
</bean>
</beans>
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("springconfig.xml");
Book bean = ac.getBean("book",Book.class);
System.out.println(bean);
}
文章标题:spring 演变过程
发布时间:2021-08-23, 20:11:40
最后更新:2021-08-23, 20:10:03