spring(二)bean自动装配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37256896/article/details/81948123

自动装配:
                    
                    <bean>元素来声明 bean 和通过使用 XML 配置文件中的<constructor-arg>和<property>元素来注入 。
                    Spring 容器可以在不使用<constructor-arg>和<property> 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量使用自动装配无法从配置文件中读懂JavaBean需要哪些属性当自动装配始终在同一个项目中使用时,它的效果最好。如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个 bean 定义。 不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之前考虑到自动装配的局限性和缺点。
                    你可以使用<bean>元素的 autowire 属性为一个 bean 定义指定自动装配模式:
                            autowire属性有以下取值:
                            no    这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。
                            byName    由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
                       byType    由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。
                           constructor    类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
                           autodetect    Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。
                    <bean>元素byname装配: <bean id="textEditor" class="com.tutorialspoint.TextEditor" autowire="byName">
                            它尝试将它的属性与配置文件中定义为相同名称的 beans 进行匹配和连接。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常
                    <bean>元素bytype装配: <bean id="textEditor" class="com.tutorialspoint.TextEditor"  autowire="byType">
                            如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将尝试匹配和连接它的属性。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常
        注解代替配置文件:
                    <!-- 指定扫描哪些注解,扫描包时会扫描指定包下的所有的子包 -->
                        <context:component-scan base-package="com.leo.demo"></context:component-scan>

                        使用时:@Component("user");
                    @Component("user")
                    @Service("user")//service层
                    @Controller("user")//web层
                    @Repository("user")//dao层
                    @Scope(scopeName="singleton|protptype")//指定对象的作用域
                    注入值:
                        使用反射的Field赋值               不建议使用破坏了封装性
                        @Value("lll")
                        private String name;
                        @Value("12")
                        private Integer age;
                    另一种是在:
                        通过set()方法赋值 推荐使用 
                        @Value("lll")
                        public void setName(String name) {
                            this.name = name;
                        }    
                    @Resouce(name="car1")//手动设置注入哪一个对象类型
                    private Car car;
                    需要在xml中配置这个car对象的不同的实例化
                    @PostConStruct 用于创建对象调用===》init-method的属性形式
                    @PreDestory用于销毁对象时调用-=》destory-method=“方法名”的属性形式
            测试的方式:
                    这样就不需要在测试时每次都创建容器
                    在类名中用注解:
                        @Runnwith(SpringJunit4ClassRunner.class)//帮我们创建容器
                        @ContextConfiguration("xxx.xml")//指定读取的配置文件
                        @Test
                        public void fun(){
                        }

在程序开发中还是用自动装配的形式多直接在属性上添加注解@AutoWirte,通样也可以使用@Resouce(name="car1")//手动设置注入哪一个对象类型,这样的需要在xml文件中进行bean的注入,然后这里读取指定的对象的注入,这样更方便。

猜你喜欢

转载自blog.csdn.net/qq_37256896/article/details/81948123