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