Spring入门配置(一) - IOC
一、初始命名空间配置
<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.xsd"> </beans>
xsi:xml schema instance,schema的作用是用来对xml文档做约束保证xml文档的正确性。(对XML部分重新学习)
参考:schema的几个重要知识:https://blog.csdn.net/weixin_39366489/article/details/78115306
二、Spring开发基本包坐标
<properties> <spring.version>5.0.5.RELEASE</spring.version> </properties> <dependencies> <!--导入spring的context坐标,context依赖core、beans、expression--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
三、Bean标签配置
-
无参构造实例化对象
<!--id为Bean在Spring容器中的唯一标识--> <bean id="userService" class="GroupId.ArtifactId.service.impl.UserServiceImpl" scope="singleton"> <!--class为Bean全限定名--> <!--scope指定对象作用范围,singleton为默认值单例,prototype为多例,request、session、global session表示WEB项目中Spring创建一个Bean对象并存到相应的域中--> <!--init-method、destroy-method用于指定类中的初始化方法和销毁方法-->
</bean> -
工厂静态方法实例化
<bean id="userDao" class="GroupId.ArtifactId.factory.StaticFactoryBean" factory-method="createUserDao" />
-
工厂实例方法实例化
<bean id="factoryBean" class="GroupId.ArtifactId.factory.DynamicFactoryBean" /> <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao" />
关于GroupId和ArtifactId(参考:https://blog.csdn.net/qq_30137611/article/details/76762070)
GroupId和ArtifactId统称为“坐标”,保证项目的唯一性
GroupId:一般分多段,主要有两段,第一段为域,第二段为公司名称或其他。域org(非盈利组织)、com(商业组织)、cn(中国)等
ArtifactId:项目名称
四、Bean依赖注入
依赖注入(Dependency Injection),Spring核心 IOC(Inversion Of Control) 的具体实现,程序中由Spring创建对象,降低耦合关系。
-
set方式依赖注入及简单的set方式 >> P命名空间注入
<!--UserServiceImpl中添加USerDaoImpl私有属性,设置set方法--> <!--将UserDaoImpl注入到Spring容器中--> <bean id="userDao" class="UserDaoImpl全限定名(fully-qualified name)"> <!--将UserServiceImpl注入到Spring,将USerDaoImpl注入到UserServiceImpl--> <bean id="userService" class="UserServiceImpl fully-qualified name"> <property name="userDao" ref="userDao" /> <!--name值为set方法出去set并将首字母小写转换后的字符串,ref表示注入到UserServiceImpl类在容器中的id--> </bean> ------------------------------------------------------------------------------------- <!--P命名空间注入也是set方法注入,但比较方便,需要引入P命名空间--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation:" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/p http://www.springframework.org/schema/p/spring-p.xsd"> <bean id="userService" class="UserService fully-qualified name" p:userDao-ref="userDao" /> </beans>
1.1 注入普通数据类型
<bean id="userDao" class="UserDaoImpl fully-qualified name"> <property name="set方法转换后的值" value="注入变量值" /> </bean>
1.2 注入引用数据类型
1.3 注入集合数据类型 –> 主要决定于集合中存储的类型,基本数据类型或String等配置value相关,对象配置ref相关引用Spring容器中的对象<!--list集合存储String或基本数据类型--> <bean id="userDao" class="UserDaoImpl fully-qualified name"> <property name="set方法转换值"> <list> <value>aaa</value> <value>bbb</value> </list> </property> </bean> -------------------------------------------------------------------- <!--list集合存储实例对象 User--> <!--集合中存储实例对象其实都是Spring容器中的引用,即id标识--> <bean id="u1" class="User fully-qualified name"> <bean id="u2" class="User fully-qualified name"> <bean id="userDao" class="UserDaoImpl fully-qualified name"> <property name="set方法转换值"> <list> <bean class="User fully-qualified name" /> <bean class="User fully-qualified name" /> <ref bean="u1" /> <ref bean="u2" /> </list> </property> </bean> -------------------------------------------------------------------- <!--Map集合的注入--> <bean id="u1" class="User fully-qualified name"> <bean id="u2" class="User fully-qualified name"> <bean id="userDao" class="UserDaoImpl fully-qualified name"> <property name="set方法转换值"> <map> <entry key="user1" value-ref="u1" /> <entry key="user2" value-ref="u2" /> </map> </property> </bean> -------------------------------------------------------------------- <!--properties 集合--> <bean id="userDao" class="UserDaoImpl fully-qualified name"> <property name="set方法转换值"> <props> <prop key="p1">aaa</prop> <prop key="p2">bbb</prop> <prop key="p3">ccc</prop> </props> </property> </bean>
-
构造方法依赖注入
<!--不再配置property,配置如下标签--> <constructor-arg name="有参构造函数形参变量名" ref="注入Spring容器的形参id"></constructor-arg>
五、应用 –> 数据源的配置
数据源的相关参数设置方法均为setXxx方法,数据源对象利用空参构造函数生成,具备此特性可将对象交由Spring管理。将数据源的数据配置到配置文件中
- Druid和C3P0参数设置方法
Druid C3P0 setDriverClassName(“com.mysql.jdbc.Driver”)
setUrl(“jdbc:mysql://localhost:3306/test”)
setUsername(“root”)
setPassword(“root”)
setDriverClassName(“com.mysql.jdbc.Driver”)
setUrl(“jdbc:mysql://localhost:3306/test”)
setUsername(“root”)
setPassword(“root”)
- 导入数据源和数据库驱动相关坐标:Druid/C3P0 + mysql-connector-java
- 提取jdbc配置到文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=root
- 在Spring配置文件中加载jdbc.properties文件,获取jdbc配置文件信息,需要引入context命名空间和约束路径
命名空间: xmlns:context="http://www.springframework.org/schema/context" 约束路径: http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-
<!--配置Spring配置文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--placeholder:占位符--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
六、配置文件及创建ApplicationContext实现类对象时参数的抽取
-
配置文件抽取
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
<import resource="applicationContext-xxx.xml"/>
-
参数抽取
ApplicationContext实现类主要有以下三种:
- 1)ClassPathXmlApplicationContext 它是从类的根路径下加载配置文件 推荐使用这种
- 2)FileSystemXmlApplicationContext 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
- 3)AnnotationConfigApplicationContext 当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
可以通过其实例的getBean()方法获得 Spring 容器中的 Bean 对象:
① 当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。
② 当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错。
开发中每次获取实例对象前都需要进行ApplicationContext实现类实例的创建获取,且参数名为配置文件名与代码耦合度较高,Spring中进行抽取。
在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext 对象了。Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。
Ⅰ. 导包:spring-web
Ⅱ. web.xml中配置监听器 ContextLoaderListener
<!--全局参数--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--Spring的监听器--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
Ⅲ. WebApplicationContextUtils工具类获取ApplicationContext实现类对象传入servletContext
七、注解开发
需要在配置文件中开启组建扫描
<context:component-scan base-package=“包位置"/>
-
原始注解
-
新注解
/* @Configuration @ComponentScan @Import */ @Configuration @ComponentScan("需要被扫描类所在包名") @Import({DataSourceConfiguration.class}) public class SpringConfiguration { } --------------------------------------------------- /* @PropertySource @value */ @PropertySource("classpath:jdbc.properties") public class DataSourceConfiguration { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; } --------------------------------------------------- @Bean(name="dataSource") public DataSource getDataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(password); return dataSource; }
---------------------------------------------------
@Test
public void testAnnoConfiguration() throws Exception {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = (UserService)applicationContext.getBean("userService");
userService.save();
DataSource dataSource = (DataSource)applicationContext.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
} -
Spring集成Junit步骤
1. 导入spring集成Junit的坐标:spring-test&junit,此处spring5及以上版本要求junit必须为4.12及以上版本
2. 使用 @Runwith(SpringJUnit4ClassRunner.class) 注解替换原来的运行期,指定测试运行环境
3. 使用 @ContextConfiguration指定配置文件或配置类
//加载spring核心配置文件 //@ContextConfiguration(value = {"classpath:applicationContext.xml"}) //加载spring核心配置类 @ContextConfiguration(classes = {SpringConfiguration.class})
4. 使用 @Autowired注入需要测试的对象创建测试方法进行测试