Spring框架的IoC

it2022-05-05  162

Spring使用

1.什么是Spring2.IoC和AOP两大核心思想3.入门Spring3.1从Spring容器里得到bean对象,3.2 bean标签的基本配置(一个bean标签称为一个statement)3.3 bean的三种实例化方式3.4 三种(DI)依赖注入方式(相当给变量赋值)3.5 读取jdbc.properties文件3.6 分模块提供配置文件 4.基于注解的IoC(原始注解,重点)5.纯注解开发IoC(新注解)5.1.注解介绍5.2.配置核心类代码5.3.测试代码Spring整合Junit

1.什么是Spring

Spring是分层的Java SE/EE应用 full-stack(全栈)轻量级开源框架,以IoC(Inversion of Controll控制反转,用于解耦)和AOP(Aspect oriented Programming,面向切面编程,本质是动态代理,不修改源码的情况下进行功能增强)为内核

2.IoC和AOP两大核心思想

IoC:Inversion of Control,控制反转。是指 把创建对象的控制权交给框架:要想得到一个对象,由原来的主动创建对象,变成自己被动接收 框架创建的对象。作用:用于降低程序间的耦合性

3.入门Spring

准备环境(创建maven项目,导入依赖)

创建目录结构(以数据库Account表为例)

创建Spring核心配置文件(命名随意,通常applicationContext.xml)

编写各个类(查询表中所有数据为例) 体现IOC的核心思想,不再以new生成对象,可以避免编译期依赖,通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制 图中涉及到的QueryRunner对象封装了jdbc的代码,开发dao层代码的简单框架。与JdbcTemplate功能相似。需要导入依赖 使用方法:

创建DBUtils的核心类QueryRunner对象 - 构造方法:QueryRunner(DataSource ds)使用QueryRunner的方法操作数据库,常用方法有 - 执行DML语句:update(sql, params),返回int表示影响行数 - 执行DQL语句:query(sql, ResultSetHandler rh,params) 返回值由ResultHandler的实现类对象决定 - BeanHandler:返回一个JavaBean对象 - BeanListHandler:返回一个JavaBean集合 - ScalarHandler:返回一个值

编写测试类

3.1从Spring容器里得到bean对象,

ApplicationContext的实现类: ClassPathXmlApplicationContext - 是从类加载路径里,加载xml配置文件的 - 什么是类加载路径:代码编译之后的那个classes文件夹 - 开发中可以认为Maven项目的:Java文件夹、resources文件夹,都是类加载路径AnnotationConfigApplicationContext - 用注解配置Spring时,通过此类加载配置类创建Spring容器,它用于读取类上的注解配置 ApplicationContext app = new ClassPathXmlApplicationContext("核心配置文件名.xml"); ApplicationContext app = new AnnotationConfigApplicationContext(核心配置类.class); getBean()方法 ApplicationContext提供了多种getBean方法的重载,常用的如下: Object bean = app.getBean("唯一标识");//需要强转 对应类型 对象名= app.getBean("唯一标识", javabean.class类型)//无需强转 编写核心配置文件

3.2 bean标签的基本配置(一个bean标签称为一个statement)

基本属性: id:唯一标识、class:bean的全限定类名 通过对应的bean标签对应的id获取对应的对象

3.3 bean的三种实例化方式

无参构造方法实例化:让Spring调用bean的无参构造,生成bean实例对象 <bean id="accountDao" class="com.Xxxx.dao.impl.AccountDaoImpl"></bean>

工厂静态方法实例化:让Spring调用一个工厂类的静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个StaticFactory工厂类

public class StaticFactory{ public static AccountDao createAccountDao(){ return new AccountDaoImpl(); } }

核心配置文件:

<bean id="accountDao" class="com.Xxxx.factory.StaticFactory" factory-method="createAccountDao"></bean> 工厂非静态方法实例化:让Spring调用一个工厂的非静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个InstanceFactory工厂类 <!-- 先配置工厂 --> <bean id="instanceFactory" class="com.Xxxx.factory.InstanceFactory"></bean> <!-- 再配置AccountDao --> <bean id="accountDao" factory-bean="instanceFactory" factory-method="createAccountDao"></bean>

3.4 三种(DI)依赖注入方式(相当给变量赋值)

set方法注入,在类中提供需要注入的成员的set方法,在配置文件中注入属性的值 <bean id="" class=""> <property name="属性名" value="属性值"></property> <property name="属性名" ref="bean的id"></property> </bean> property标签:用在bean标签内部,表示要给某一属性注入数据 name:属性名称value:要注入的属性值,注入简单类型值ref:要注入的属性值,注入其它bean对象 构造方法注入,在类中提供构造方法,通过构造方法给成员变量注入值 <bean id="" class=""> <constructor-arg name="构造参数名称" value="构造参数的值"></constructor-arg> <constructor-arg name="构造参数名称" ref="bean的id"></constructor-arg> </bean> name:构造参数的名称value:要注入的值,注入简单类型值ref:要注入的值,注入其它bean对象 p名称空间注入(本质仍然是set方法,不作介绍)

3.5 读取jdbc.properties文件

准备一个properties文件放在resources里:jdbc.properties jdbc.driver=com.mysql.jdbc.Driver //驱动 jdbc.url=jdbc:mysql:///spring //数据库名 jdbc.username=root //数据库账号 jdbc.password=root //数据库密码 使用<context:property-placeholder location="classpath:jdbc.properties"/>需要导入Context命名空间 <beans xmlns:名称空间="http://www.springframework.org/schema/名称空间" xsi:scehmaLocation=" http://www.springframework.org/schema/名称空间 http://www.springframework.org/schema/名称空间/spring-名称空间.xsd"> </beans>

读取jdbc.properties中的文件使用${配置文件中的key获取对应的值}

3.6 分模块提供配置文件

在大型项目开发中,如果把所有的配置都写在一个配置文件applicationContext.xml中,会导致:

配置文件过于臃肿不利于分模块开发,不利于模块之间的解耦

Spring提供了分模块配置的方式,即:每个模块提供一个配置文件,在核心配置文件中引入模块配置:

<import resource="applicationContext-xx.xml"/> <import resource="applicationContext-yy.xml"/> 将负责数据库的配置放入applicationContext.xml文件中 操作导入

4.基于注解的IoC(原始注解,重点)

以上例环境为例,进行注解开发

编写类

@Component:类级别的一个注解,用于声明一个bean,使用不多

value属性:bean的唯一标识。如果不配置,默认以首字母小写的变量名为id

@Controller, @Service, @Repository,作用和@Component完全一样,但更加的语义化,使用更多

@Controller:用于web层的bean

@Service:用于Service层的bean

@Reposiroty:用于dao层的bean


@Autowired:用于注入bean对象(byType注入)按依赖类型,从Spring容器中查找要注入的bean对象 如果找到一个,直接注入如果找到多个,则以变量名为id,查找bean对象并注入如果找不到,抛异常 @Qualifier:是按id注入,但必须和@Autowired配合使用。

绝大多数情况下,只要使用@Autowired注解注入即可

注解注入时,不需要set方法了

核心配置文件

运行测试

5.纯注解开发IoC(新注解)

5.1.注解介绍

@Configuration把一个Java类声明为核心配置类 加上Java类上,这个Java类就成为了Spring的核心配置类,用于代替applicationContext.xml 是@Component的衍生注解,所以:核心配置类也是bean,里边可以注入依赖@ComponentScan配置组件注解扫描 basePackages属性:指定扫描的基本包 @PropertySource用于加载properties文件 value属性:指定propertis文件的路径,从类加载路径里加载@Import用于导入其它配置类Spring允许提供多个配置类(模块化配置),在核心配置类里加载其它配置类相当于xml中的标签 @Value:注入简单类型值,例如:基本数据类型和String
@Bean注解:方法级别的注解用于把方法返回值声明成为一个bean,作用相当于 < bean >标签可以用在任意bean对象的方法中,但是通常用在@Configuration标记的核心配置类中@Bean注解的属性: value属性:bean的id。如果不设置,那么方法名就是bean的id @Bean的依赖注入 @Bean注解的方法可以有任意参数,这些参数即是bean所需要的依赖

5.2.配置核心类代码

5.3.测试代码

Spring整合Junit

作用:在单元测试类里,就可以使用Spring的注解,注入依赖。不需要再自己创建容器获取对象使用步骤 1. 在pom.xml文件中增加依赖:spring-test 和 junit 2. 修改单元测试类 1. 在单元测试类上增加注解:@RunWith(SpringJunit4ClassRunner.class) 目的:使用Spring的单元测试运行器,替换Junit原生的运行器 2. 在单元测试类上增加注解:@ContextConfiguration() 目的:指定配置文件或配置类


最新回复(0)