Spring 是一款轻量级的JavaEE开发框架,其对比的EJB是Sun官方力推的JavaEE解决方案。使用EJB编码必须要实现EJB的组件,必须运行在支持EJB的服务器中,无论是测试还是运行都十分不便。Spring能够非侵入的解决JavaEE的通用问题,在测试、运行、扩展等方面比EJB强大的多。
Spring构建于众多优秀的设计模式之上:工厂设计模式、代理设计模式、模板方法设计模式、策略设计模式...
设计模式:前人总结好的,用于解决特定问题的方案。
学习Spring的核心就是学习其应用的设计模式本身要解决那些问题。
工厂设计模式:使用工厂创建对象,代替new创建对象。
new模式的问题:
image-20200727192500840new模式下,类和类之间是强耦合的。
解决方案:工厂设计模式(解耦合)
image-20200727193150450配置一个properties文件
userService=com.bcl.service.impl.UserServiceImpl
创建BeanFactory工厂类
public class BeanFactory {
private static Properties prop = new Properties();
static{
//通过流读取配置文件,保存到prop
InputStream in = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
try {
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static Object getBean(String id){
//获取类对象
Object o = null;
try {
Class c = Class.forName(prop.getProperty(id));
o = c.newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
//创建对象
return o;
}
}
面向接口编程
UserService service = (UserService) BeanFactory.getBean("userService");
工厂设计模式的特点:配置文件+反射+面向接口编程
通过工厂模式,解开了类和类之间强耦合,提高了程序的可维护性和可扩展性,满足开闭原则。
Spring框架的基本作用:对象工厂(容器)。可以借助Spring工厂创建(获取)对象,解开类和类之间的耦合,提高程序的维护性和扩展性。
导入依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.3.26.RELEASEversion>
dependency>
导入配置文件
applicationContext.xml位置任意,建议放置在resources根目录下。
<bean id="标识" class="全类名"/>
创建Spring工厂,获取对象
Spring中工厂类型:ApplicationContext(接口)
实现类:
非web环境: ClassPathXmlApplicationContext
web环境: XmlWebApplicationContext
方法:
Object getBean(String id);
创建一个业务类
配置applicationContext.xml
<bean id="userService" class="com.bcl.service.impl.UserServiceImpl"/>
创建Spring工厂,获取对象
//创建Spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//从工厂中获取UserService
UserService userService = (UserService)applicationContext.getBean("userService");
userService.deleteUserById(1);
Spring提供了一套完整的企业应用开发方案,同时还能和其它框架整合(Struts2、MyBatis)。在发展中,Spring族系涌现出一系列的优秀的子框架,最终发展成一个开发生态。Spring族系有名的框架:SpringMVC、SpringBoot、SpringCloud、SpringData、SpringSecurity、SpringTask...
Spring工厂创建对象:读取配置文件(applicationContext.xml),获取到全类名,通过反射默认调用无参构造方法创建对象。
bean标签的scope属性设置对象是否单例:
singleton (单例 默认值)
prototype (多例)
为什么单例是默认策略?节省内存空间
可以被用户公用的对象(单例):
Dao、service、SqlSessionFactory
不能被用户公用的对象(多例):
connection、sqlSession、Cart、Action
给对象的属性赋值(注入值)。
image-20200727193438437本质:通过无参构造方法创建对象后,调用对象属性的set方法进行赋值。
操作:在bean标签中,通过property子标签为对象的属性进行set注入。
<bean id="s" class="com.bcl.entity.Student">
<property name="id">
<value>1value>
property>
<property name="name">
<value>xiaoheivalue>
property>
<property name="age">
<value>18value>
property>
<property name="score">
<value>100.0value>
property>
bean>
<bean id="s" class="com.bcl.entity.Student">
<property name="id" value="1"/>
<property name="name" value="xiaohei"/>
<property name="age" value="18"/>
<property name="score" value="100.0"/>
bean>
<bean id="a" class="com.bcl.entity.Address">
<property name="city" value="郑州"/>
<property name="street" value="文化路"/>
bean>
<bean id="p" class="com.bcl.entity.Person">
<property name="addr">
<ref bean="a"/>
property>
<property name="id" value="1"/>
<property name="personName" value="xiaohei"/>
bean>
<bean id="p" class="com.bcl.entity.Person">
<property name="addr" ref="a"/>
<property name="id" value="1"/>
<property name="personName" value="xiaohei"/>
bean>
<bean id="u" class="com.bcl.entity.User">
<property name="id" value="1"/>
<property name="name" value="xiaohei"/>
<property name="os">
<array>
<value>1value>
<value>100.0value>
<value>hhhvalue>
<ref bean="a"/>
array>
property>
<property name="list">
<list>
<value>1value>
<value>hhhvalue>
<ref bean="a"/>
<ref bean="a2"/>
list>
property>
<property name="set">
<set>
<value>1value>
<value>1value>
<value>hhhvalue>
<ref bean="a"/>
<ref bean="a2"/>
set>
property>
bean>
<bean id="u" class="com.bcl.entity.User">
<property name="map">
<map>
<entry key="k1"><value>v1value>entry>
<entry key="k2" value="v2"/>
<entry key="k3" value-ref="a"/>
<entry key-ref="p" value-ref="a"/>
map>
property>
<property name="prop">
<props>
<prop key="pk1">pv1prop>
<prop key="pk2">pv2prop>
props>
property>
bean>
本质:调用有参构造方法创建对象的同时,为属性赋值。
前提:必须要提供有参构造
操作:在bean标签中定义constructor-arg子标签。
当一个类中的多个有参构造方法的参数个数不同时,constructor-arg标签会根据数量匹配构造方法进行调用
<bean id="b1" class="com.bcl.entity.Book">
<constructor-arg value="1"/>
<constructor-arg value="十万个为什么"/>
<constructor-arg value="100000.0"/>
<constructor-arg value="佚名"/>
bean>
当一个类中的构造方法,形参个数相同,类型不同时,通过type属性明确形参类型,调用指定构造方法。
<bean id="b1" class="com.bcl.entity.Book">
<constructor-arg value="1" type="java.lang.Integer"/>
bean>
index属性设置形参的下标,从0开始
<bean id="b1" class="com.bcl.entity.Book">
<constructor-arg value="1" type="java.lang.Integer" index="0"/>
<constructor-arg value="十万个为什么" type="java.lang.String" index="1"/>
bean>
本质:Spring自动分析属性,调用属性的set方法完成赋值。
操作:通过bean标签的属性 autowire = "byType"|"byName"
<bean id="bookService" class="com.bcl.service.impl.BookServiceImpl"/>
<bean id="bookAction" class="com.bcl.action.BookAction" autowire="byType">
bean>
如果你觉得这篇内容对你挺有有帮助的话: