目录
前言
这几天学习了spring,学习过程中感觉特别的模糊,是时候开始总结整理一下了.从第一天的学习基础开始整理.学习了,spring的优势,spring的相关API,spring的体系结构以及spring的一些基本配置等.
一、spring是什么?
spring以IOC(控制翻转)和AOP(面向切面编程)为核心,提供了表现层(SpringMVC),持久层(Spring JDBC),业务层事务管理等众多的企业级应用技术的full-stack(全栈)轻量级的java开源框架.
优势:
- 方便解耦,简化开发:(通过spring的IOC容器,将对象之间的依赖关系交给了spring进行控制,避免了编码过程造成的程序之间的耦合,)
- AOP编程的支持:(spring提供AOP功能,方便进行面向切面的编程,是许多不容易用传统OOP实现的功能通过AOP轻松实现)
- 声明式事务的支持:(通过声明式方式灵活的进行事务的管理,提供开发效率和质量)
- 方便程序的测试:(在spring中,可以使用spring对Junit4的支持,通过注解的方式方便的进行对程序的测试操作)
- 方便集成各种优秀框架:(spring不仅不排斥各种优秀的开源框架,反而可以降低各种框架的使用难度,提供了对各种框架的使用支持)
降低了JavaEE的API的使用:(spring对很多难用的API提供了一个简单的封装层,通过spring进行简单的封装,使使用难度大大减低.)
二、spring的体系结构
三 spring配置文件
1.Bean文件的基本配置
基本配置:
- id:唯一标识
- class:全限定类名
范围配置:
- singleton:默认值(单例)--->创建出的实例为单例模式,IOC之创建一次,然后一直存在
- prototype:多例的--->创建出的实例为多例模式,每次获取bean的时候,IOC都给我们重新创建新对象
2.spring创建对象的三种基本方式
1.无参构造方式实例化:
- 创建UserDaoImpl
package com.james.dao.impl; import com.james.dao.UserDao; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; /*实现Userdao接口(save()方法)*/ public class UserDaoImpl implements UserDao{ public UserDaoImpl(){ System.out.println("调用了无参的构造方法"); } public void save() { System.out.println("执行了UserDaoImplements的save方法"); } }
- 创建UserServiceImpl
package com.james.service.impl; import com.james.dao.UserDao; public class UserServiceImpl implements com.itheima.service.UserService { public void save() { } }
- 创建测试类
package com.james; import com.james.dao.UserDao; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class test { @Test public void save(){ //从spring的IOC中获取userDao对象 ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao=(UserDao)app.getBean("userDao"); userDao.save(); } }
- 编写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"> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"></bean> </beans>
执行结果:(spring容器已经成功对Bean对象进行了实例化)
:
2.静态工厂方法实例化:(了解 )
此种方式提供一个静态工厂对对象进行实例化,方法如下:
- 自定义一个工厂类
package com.james.factory; import com.james.dao.UserDao; import com.james.dao.impl.UserDaoImpl; public class StaticFactory { public static UserDao createUserDao(){ return new UserDaoImpl(); } }
- 配置文件
上述代码中:对应的UserDaoImplement实现类指定了其对应的工厂类StaticFactory,而factory-method的属性通知spring容器调用工厂类的createUserDao方法获取UserDaoImpl的实例.
3.工厂普通方法实例化(了解)
- 自定义工厂类
package com.james.factory; import com.james.dao.UserDao; import com.james.dao.impl.UserDaoImpl; public class NormalFactory { public UserDao createUserDao(){ return new UserDaoImpl(); } }
- 配置文件
上述代码中:首先配置一个实例工厂Bean,然后配置需要实例化的Bean,在id为userDao的Bean中,使用factory-bean属性指定一个实例工厂,该属性值对应实例工厂的id属性值,使用factory-method属性确定使用工厂的的createBean方法.
三 Bean的依赖注入
依赖注入是Spring框架中一种解耦的策略,称为DI或IOC(控制反转),主要有set方式和constractor(构造方法)方式,使得类与类之间以配置文件的形式组织在一起.
例如classA 中用到了classB如果写代码的话是new 一个classB,而用依赖注入的方式则是在applicationContext.xml里面写两个
<bean id="id1" class="A"><property name="B" ref="id2"></bean> <bean id="id2" class="B"></bean>
就是在类A里原来需要new 的地方就不需要写了,
依赖注入的两种实现方式:
构造方法:
set方法:
Bean依赖注入的数据类型
1)普通数据类型
2)引用数据类型
前两种已经在依赖注入的构造方法和set方法两种方式中体现出来.
3)集合数据类型(数组类型,list集合,set集合,双列集合)
package com.james.Service.impl;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Data
public class UserService {
private String[] hobbies;
private List<Object> games;
private Set<Object> names;
private Map<String, Object> map;
private Properties prop;
public void setProp(Properties prop) {
this.prop = prop;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public void setGames(List<Object> games) {
this.games = games;
}
public void setNames(Set<Object> names) {
this.names = names;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
配置文件:
<?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>
<bean id="userService" class="com.itheima.Service.impl.UserServiceImpl">
<!--bean类型的依赖注入之数组类型-->
<property name="games">
<list>
<value>LOL</value>
<value>王者荣耀</value>
</list>
</property>
<!--bean类型的依赖注入值list类型-->
<property name="hobbies">
<array>
<value>抽烟</value>
<value>喝酒</value>
<value>烫头</value>
</array>
</property>
<!--bean类型的依赖注入之set类型-->
<property name="names">
<set>
<value>James</value>
<value>Danny</value>
</set>
</property>
<!--bean类型的依赖注入之map类型-->
<property name="map">
<map>
<entry key="one" value="破鞋"/>
<entry key="two" value="一匹马"/>
</map>
</property>
<property name="prop">
<props>
<prop key="a">A</prop>
<prop key="b">B</prop>
</props>
</property>
</bean>
</beans>
</beans>