IOC : https://blog.csdn.net/ivan820819/article/details/79744797
软件设计六大原则 : http://www.uml.org.cn/sjms/201211023.asp#5
低耦合 : https://blog.csdn.net/ellis1970/article/details/84302912
Spring 的核心是控制反转(IOC)/依赖注入(DI)和面向切面(AOP)。
是一个分层的轻量级开源框架。
@Before:初始化方法 对于每一个测试方法都要执行一次(注意与BeforeClass区别,后者是对于所有方法执行一次)
@After:释放资源 对于每一个测试方法都要执行一次(注意与AfterClass区别,后者是对于所有方法执行一次)
创建项目:
1.创建maven项目
2.引入spring的依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>4.2.5.RELEASE</spring.version>
</properties>
<!--Spring核心基础依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!--日志相关-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试相关-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
3.添加配置文件
建议设置为 applicationContext.xml 的文件名
<?xml version="1.0" encoding="UTF-8"?>
<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>
4.添加相应的模块
dao、model、service层代码
注:utils层:存放一些数据库的数据
Dao层(mapper层):与数据库进行交互,增删改查
Service层(业务层、biz层):实现操作的具体方法,逻辑处理,调用dao层方法
Controller层(控制层、action层):控制业务逻辑,接收数据
entity层(实体层、domain层、pojo层、model层):定义实体、定义各个属性及他们的getset
view层:与controller层联系紧密,负责前台jsp页面表示
5.将bean的实例化交给spring
<bean name="userDao" class="com.tledu.spring.dao.impl.UserDaoImpl" />
<!--name 属性名字/ref 引用的bean的名字-->
<bean id="userService" class="com.tledu.spring.service.UserService">
<property name="userDao" ref="userDao" />
</bean>
6.测试类
public class UserServiceTest {
@Test
public void add() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// userService是bean的id或name
UserService userService = (UserService) applicationContext
.getBean("userService");
userService.add(null);
}
}
注入方法
1.set注入
<property name="userDao" ref="userDao" />
2.通过构造方法注入
<bean name="userDao" class="com.tledu.spring.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.tledu.spring.service.UserService">
<constructor-arg ref="userDao"/>
</bean>
注:ref是引入,value是直接填值
scope
对象在spring容器中的创建方式。
有singleton(单例模式)和prototype(“多例模式”:每一次getBean 都会创建一个新的实例化对象)两种,
以及实用于web程序的request,session和global session类型
集合属性注入
相关类
private List<String> lists;
private Set<String> sets;
private Map<String, String> maps;
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Set<String> getSets() {
return sets;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
配置文件
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
<property name="lists" >
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<property name="sets" >
<!-- set不可重复,重复不添加,所以只有第一个三 -->
<set>
<value>3</value>
<value>3</value>
<value>5</value>
<value>4</value>
</set>
</property>
<property name="maps">
<!-- mapkey不可重复,重复key不添加,value覆盖 -->
<map>
<entry key="1" value="2"></entry>
<entry key="1" value="3"></entry>
<entry key="2" value="2"></entry>
</map>
</property>
</bean>
<bean id="userService" class="com.tledu.zrz.service.UserService"
scope="singleton">
<!-- 构造方法注入 -->
<constructor-arg>
<ref bean="userDao" />
</constructor-arg>
</bean>
自动装配
1.byName是根据setter方法名字进行匹配,如果找不到,就不赋值
设置方式
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.tledu.zrz.service.UserService" autowire="byName"></bean>
2.byType是根据setter方法的参数列表中的数据类型进行匹配,如果beans.xml中出现了多个相同类型的对象,就会报错
设置方式
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.tledu.zrz.service.UserService" autowire="byType"></bean>
生命周期
servlet的生命周期,构造方法 -- init -- service -- destroy
spring类似
配置文件
<!-- init-method : 用于设置初始化的方法
destory-method : 用于设置销毁资源的方法 -->
<bean id="userService" class="com.tledu.zrz.service.UserService"
autowire="byName" init-method="init" destroy-method="destroy" >
</bean>
相关类
public void init(){
System.out.println("init--------");
}
public void destroy(){
System.out.println("destroy----------");
}
public UserService() {
System.out.println("service构造方法");
}
默认的单例模式中,Destroy会默认执行。这个时候对象的生命周期会和Spring容器的生命周期绑定到一起,
所以当我们销毁Spring容器的时候,会把所有的对象销毁,并自动调用destroy方法
prototype时,对象的生命周期就不会再和Spring容器绑定,销毁Spring容器的时候也就不会再执行该对象的destroy方法
迟加载:不想让某个类在解析的时候就创建对象,而是用到的时候在创建对象
配置文件:
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl" >
<bean id="userService" class="com.tledu.zrz.service.UserService" scope="prototype"
autowire="byName" init-method="init" destroy-method="destroy" lazy-init="true" >
</bean>
我们可以在beans标签中添加default-lazy-init="true" 对所有的bean进行迟加载
default-lazy-init 和 lazy-init 可以同时存在,比如 10个对象中 只有一个不需要迟加载,
那么可以使用 default-lazy-init = true 全部设置迟加载,然后再去指定的bean中添加 lazy-init=false