格瑞特网站建设,做网站月薪资多少,电子商务网站开发书,网址大全软件下载安装一、自动装配说明
1.1概述 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean。
1.2装配机制
Spring中bean有三种装配机制#xff0c;分别是#xff1a; 在xml中显式配置#xff1b; 在java中显式配置#xff1b; 隐式…一、自动装配说明
1.1概述 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean。
1.2装配机制
Spring中bean有三种装配机制分别是 在xml中显式配置 在java中显式配置 隐式的bean发现机制和自动装配。 这里我们主要讲第三种自动化的装配bean。
Spring的自动装配需要从两个角度来实现或者说是两个操作 组件扫描(component scanning)spring会自动发现应用上下文中所创建的bean 自动装配(autowiring)spring自动满足bean之间的依赖也就是我们说的IoC/DI 组件扫描和自动装配组合发挥巨大威力使得显示的配置降低到最少。 1.3测试环境搭建
新建实体类
package com.yanyu.pojo;public class Cat {public void shout() {System.out.println(miao~);}
}package com.yanyu.pojo;public class Dog {public void shout() {System.out.println(wang~);}
}package com.yanyu.pojo;import lombok.Data;Data
public class User {private Cat cat;private Dog dog;private String str;
}
编写Spring配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdbean iddog classcom.yanyu.pojo.Dog/bean idcat classcom.yanyu.pojo.Cat/bean iduser classcom.yanyu.pojo.Userproperty namecat refcat/property namedog refdog/property namestr valueyanyu//bean
/beans
测试 import com.yanyu.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {Testpublic void testMethodAutowire() {ApplicationContext context new ClassPathXmlApplicationContext(beans.xml);User user (User) context.getBean(user);user.getCat().shout();user.getDog().shout();}
}
二、自动装配
2.1byName
autowire byName (按名称自动装配)
由于在手动配置xml过程中常常发生字母缺漏和大小写等错误而无法对其进行检查使得开发效率降低。
采用自动装配将避免这些错误并且使配置简单化。
修改bean配置增加一个属性 autowirebyName bean iduser classcom.yanyu.pojo.User autowirebyNameproperty namestr valueyabyu//bean 再次测试结果依旧成功输出我们将 cat 的bean id修改为 catXXX再次测试 执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法真正的setCat就没执行对象就没有初始化所以调用时就会报空指针错误。 当一个bean节点带有 autowire byName的属性时。 将查找其类中所有的set方法名例如setCat获得将set去掉并且首字母小写的字符串即cat。 去spring容器中寻找是否有此字符串名称id的对象。 如果有就取出注入如果没有就报空指针异常。 2.2byType
autowire byType (按类型自动装配)
使用autowire byType首先需要保证同一类型的对象在spring容器中唯一。如果不唯一会报不唯一的异常。 NoUniqueBeanDefinitionException 测试
1、将user的bean配置修改一下 autowirebyType
2、测试正常输出
3、在注册一个cat 的bean对象
bean iddog classcom.yanyu.pojo.Dog/
bean idcat classcom.yanyu.pojo.Cat/
bean idcat2 classcom.yanyu.pojo.Cat/bean iduser classcom.yanyu.pojo.User autowirebyTypeproperty namestr valueqinjiang/
/bean
4、测试报错NoUniqueBeanDefinitionException
5、删掉cat2将cat的bean名称改掉测试因为是按类型装配所以并不会报异常也不影响最后的结果。甚至将id属性去掉也不影响结果。
这就是按照类型自动装配
2.3使用注解
配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdbean iddog classcom.yanyu.pojo.Dog/bean idcat classcom.yanyu.pojo.Cat/bean iduser classcom.yanyu.pojo.User autowirebyTypeproperty namestr valueyabyu//bean
/beans2、开启属性注解支持
context:annotation-config/
Autowired Autowired是按类型自动转配的不支持id匹配。 需要导入 spring-aop的包 直接在属性上使用也可以在set方式上使用! 使用Autowired我们可以不用编写Set方法了前提是你这个自动装配的属性在I0C (Spring) 容器中存在且符合名字byname! 测试
1、将User类中的set方法去掉使用Autowired注解
package com.yanyu.pojo;import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;Data
Component
public class User {Autowiredprivate Cat cat;Autowiredprivate Dog dog;private String str;
}2、此时配置文件内容
context:annotation-config/bean iddog classcom.yanyu.pojo.Dog/
bean idcat classcom.yanyu.pojo.Cat/
bean iduser classcom.yanyu.pojo.User/
3、测试成功输出结果 Autowired(requiredfalse) 说明false对象可以为nulltrue对象必须存对象不能为null。 //如果允许对象为null设置required false,默认为true
Autowired(required false)
private Cat cat; Qualifier Autowired是根据类型自动装配的加上Qualifier则可以根据byName的方式自动装配 Qualifier不能单独使用
测试实验步骤
1、配置文件修改内容保证类型存在对象。且名字不为类的默认名字
bean iddog1 classcom.yanyu.pojo.Dog/bean iddog2 classcom.yanyu.pojo.Dog/bean idcat1 classcom.yanyu.pojo.Cat/bean idcat2 classcom.yanyu.pojo.Cat/
2、没有加Qualifier测试直接报错
3、在属性上添加Qualifier注解
Autowired
Qualifier(value cat2)
private Cat cat;
Autowired
Qualifier(value dog2)
private Dog dog;
测试成功输出
Resource(jdk8取消注解) Resource如有指定的name属性先按该属性进行byName方式查找装配 其次再进行默认的byName方式进行装配 如果以上都不成功则按byType的方式自动装配。 都不成功则报异常。
三、Spring注解开发
3.1环境配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
!-- 指定要扫描的包--context:component-scan base-packagecom.yanyu.pojo/context:annotation-config/
/beans
3.2Bean的实现
我们之前都是使用 bean 的标签进行bean注入但是实际开发中我们一般都会使用注解
1、配置扫描哪些包下的注解
!--指定注解扫描包--
context:component-scan base-packagecom.yanyu.pojo/
2、在指定包下编写类增加注解
Component(user)
// 相当于配置文件中 bean iduser class当前注解的类/
public class User {public String name 烟雨;
}
3、测试
Test
public void test(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(beans.xml);User user (User) applicationContext.getBean(user);System.out.println(user.name);
}
3.3属性注入
使用注解注入属性
1、可以不用提供set方法直接在直接名上添加value(值)
Component(user)
// 相当于配置文件中 bean iduser class当前注解的类/
public class User {Value(烟雨)// 相当于配置文件中 property namename value烟雨/public String name;
}
2、如果提供了set方法在set方法上添加value(值);
Component(user)
public class User {public String name;Value(烟雨)public void setName(String name) {this.name name;}
}
3.4衍生注解
我们这些注解就是替代了在配置文件当中配置步骤而已更加的方便快捷
Component三个衍生注解
为了更好的进行分层Spring可以使用其它三个注解功能一样目前使用哪一个功能都一样。 Controllerweb层 Serviceservice层 Repositorydao层
写上这些注解就相当于将这个类交给Spring管理装配了
3.5自动装配注解
在Bean的自动装配已经讲过了可以回顾 作用域 scope singleton默认的Spring会采用单例模式创建这个对象。关闭工厂 所有的对象都会销毁。 prototype多例模式。关闭工厂 所有的对象不会销毁。内部的垃圾回收机制会回收
Controller(user)
Scope(prototype)
public class User {Value(yanyu)public String name;
}
3.6小结 XML与注解比较 XML可以适用任何场景 结构清晰维护方便 注解不是自己提供的类使用不了开发简单方便 xml与注解整合开发 推荐最佳实践 xml管理Bean 注解完成属性注入 使用过程中 可以不用扫描扫描是为了类上的注解 context:annotation-config/ 作用 进行注解驱动注册从而使注解生效 用于激活那些已经在spring容器里注册过的bean上面的注解也就是显示的向Spring注册 如果不扫描包就需要手动配置bean 如果不加注解驱动则注入的值为null 3.7基于Java类进行配置
JavaConfig 原来是 Spring 的一个子项目它通过 Java 类的方式提供 Bean 的定义信息在 Spring4 的版本 JavaConfig 已正式成为 Spring4 的核心功能 。
测试
1、编写一个实体类Dog
package com.yanyu.pojo;import org.springframework.stereotype.Component;Component //将这个类标注为Spring的一个组件放到容器中
public class Dog {public String name dog;
}2、新建一个config配置包编写一个MyConfig配置类
package com.yanyu.config;import com.yanyu.pojo.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration //代表这是一个配置类
public class MyConfig {Bean //通过方法注册一个bean这里的返回值就Bean的类型方法名就是bean的idpublic Dog dog(){return new Dog();}}3、测试 import com.yanyu.config.MyConfig;
import com.yanyu.pojo.Dog;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {Testpublic void test2(){ApplicationContext applicationContext new AnnotationConfigApplicationContext(MyConfig.class);Dog dog (Dog) applicationContext.getBean(dog);System.out.println(dog.name);}
}
导入其他配置如何做呢
1、我们再编写一个配置类
Configuration //代表这是一个配置类
public class MyConfig2 {
}
2、在之前的配置类中我们来选择导入这个配置类
Configuration
Import(MyConfig2.class) //导入合并其他配置类类似于配置文件中的 inculde 标签
public class MyConfig {Beanpublic Dog dog(){return new Dog();}}
关于这种Java类的配置方式我们在之后的SpringBoot 和 SpringCloud中还会大量看到我们需要知道这些注解的作用即可