spring第一天
什么是Spring
Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。Spring的核心是控制反转( IOC )和面向切面( AOP )。
Spring的优势
- 容器性质,方便解耦,简化开发
- AOP编程的支持
- 声明式事务的支持
- 集成各种优秀框架
- 降低JavaEE API的使用难度
Spring功能模块
Spring IOC
在传统的三层架构中,各层之间相互依赖,每次调用需要创建大量的对象,非常消耗资源,Spring提供了IOC机制,以容器的形式为我们管理对象
IOC容器细节
创建容器对象的方式:
- 在xml中配置< bean >元素
- 以静态工厂的形式创建
<!--
id 给容器中的对象起一个唯一标识
class 工厂类的全限定类名
factory-method 工厂类里面的静态方法
-->
<bean id="bean" class="com.ioc.BeanStaticFactory" factory-method="getInstance">
</bean>
- 普通工厂创建方式
<!--
配置工厂,让Spring容器产生工厂实例
-->
<bean id="factory" class="com.ioc.BeanFactory">
</bean>
<!--
factory-bean 工厂实例在Spring容器中的唯一标 识
factory-method 工厂实例中的方法
-->
<bean id="bean" factory-bean="factory" factory-method="getInstance">
</bean>
bean标签细节
用于配置让spring容器来创建对象,默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功
属性
属性
- id :给在容器中的对象提供一个唯一标识,用来获取对象
- class: 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
- scope: 指定对象范围。igleton: 默认值,单例。prototype: 多例。request: WEB 项目中,Spring容器创建一个Bean对象,会将该对象存入request。 session WEB : 项目中,Spring容器创建一个Bean对象,会将该对象存入session 。golbal session WEB: 项目中,应用在集群环境.如果没有集群环境那么 global session 相当于session
- init-method : 指定类的初始化名称
- destory-method : 指定类中销毁方法的名称
Spring DI
DI(Denpendency Injection) 依赖注入,是 IoC 的具体实现,通过 DI 操作就可以给对象的属性赋值,甚至对象之间的依赖关系也可以通过此操作实现。
- 使用property注入属性
name : 属性名,调用该属性的set方法
value: 属性值,通过set方法赋值
ref: 属性是其他bean类型采用ref(字符串除 外) - 构造方法注入
constructor-arg 让属性赋值采用构造函数赋值
index: 指定参数在构造函数中的索引位置
type: 指定参数在构造函数中的数据类型
name: 指定参数在构造函数中的名字
value: 具体的参数值
ref: 如果需要的数据为其他bean类型,使用ref
需要提供对应的构造方法
注意,一定要加入p名称空间约束
- 注入集合属性
<!-- 注入数组 -->
<property name="myStrs">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCCC</value>
</array>
</property>
<!-- 注入List -->
<property name="myList">
<list>
<value>DDD</value>
<value>EEE</value>
<value>FFF</value>
</list>
</property>
<!-- 注入Set -->
<property name="mySet">
<set>
<value>GGG</value>
<value>KKK</value>
<value>LLL</value>
</set>
</property>
<!-- 注入myMap -->
<property name="myMap">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB"> <value>bbb</value></entry>
</map>
</property>
<!-- 注入Properties -->
<property name="myProps">
<props>
<prop key="testA">aaaa</prop>
<prop key="testB">bbbb</prop>
</props>
</property>
基于注解的方式
创建bean对象
- @Component 该注解加在类上代表该类需要让Spring容器 去创建对象
- @Service: 一般用于业务层
- @Conntroller: 一般用于表现层
- @Repository: 一般用于持久层
- @Value(“lisi”) 为属性注入值
- @Autowaired 自动按照类型注入,使用注解注入属性时,set方法可以省略,该注解只能注入bean类型,当有多个相同类型时,将bean的id作为要注入对象的属性名,也可以注入成功。
- @Qualifier 在 @Autowaired 注入的基础之上,再按照Bean的id注入。在给属性注入数据时不能独立使用,必须和@Autowire 一起使用,但是给方法参数注入时,可以独立使用。
- @Resource 直接按照bean的id注入,只能注入bean类型
- @Scope 指定bean的作用范围 取值为:singleton , prototype , request , session , golbalsession
- @PostConstruct 指定初始化方法 执行顺序
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
配置文件需要加入context标签
核心配置文件配置注解驱动
<!-- 配置要扫描的注解包 -->
<context:component-scan base-package="com.annataion">
</context:component-scan>
新注解
- @Configuration 用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解可以使用AnnotationConfigApplicationContext(配置类.class)加载配置
- @ComponentScan 用于指定spring在初始化容器时要扫描的包。basePackages: 指定需要被扫描的包,如果不写任何属性,默认扫描当前坐在类的包以及子包。
- @Bean 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器
- @PropertySource 用于加载 .properties 文件。例如当配置数据库连接池的时候就可以使用该注解加载 properties 文件。
属性:values[] : properties 文件所在路径,文件如果在类路径下,需要加载 classpath。使用@Value("${jdbc.driver}")方式注入属性 - @Import 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。
整合JUNIT
整合junit4
- @RunWith(SpringJUnit4ClassRunner.class) :
指明使用什么类来创建容器,当然也可以写成以下方式@RunWith(SpringRunner.class) - @ContextConfiguration(classes=TestConfig.class ) : location 导入具体的配置文件,classes 导入具体的配置类
整合junit5
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes=TestConfig.class)
public class SpringJUnit5Test {
@Autowired
private Student student;
@org.junit.jupiter.api.Test
public void test1() {
System.out.println(student);
}
}
@ExtendWith(SpringExtension.class) 指示JUnit Jupiter使用Spring支持扩展测试。
当然,也可以写成这种形式
@SpringJUnitConfig(classes = TestConfig.class)
public class SpringJUnit5Test {
@Autowired
private Student student;
@org.junit.jupiter.api.Test
public void test1() {
System.out.println(student);
}
}