1、服务端的三层开发
表现层、业务层(spring就属于业务层)、持久层
2、Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用
3、Spring的核心是控制反转(IoC控制反转)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
4、Spring框架的优点
- 方便解耦,简化开发,Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理,也就是IoC的作用
- AOP编程的支持,Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。(可扩展性)
- 声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。
- 方便程序的测试,Spring对Junit4支持,可以通过注解方便的测试Spring程序。
- 方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。
- 降低JavaEE API的使用难度,Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
5、Spring的核心配置文件
<?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">
<!--IOC管理bean-->
<bean id="userService" class="cn.tx.service.UserServiceImpl" />
</beans>
(1)bean标签的一些属性
- id属性:代表对象的唯一标识。可以看做一个人的身份证号
-
注意,该id属性的值在配置文件中必须是唯一的
-
-
class属性:用来指定要创建的java对象的类名,这个类名必须是全限定类名(带包名)
-
scope属性,scope属性代表Bean的作用范围。
-
singleton单例(默认值),最常用的方式。
-
prototype多例
-
-
request应用在Web项目中,每次HTTP请求都会创建一个新的Bean
-
session应用在Web项目中,同一个HTTP Session 共享一个Bean
(2)bean对象的创建和销毁的两个属性配置
Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法
- 方法一:init-method:当bean被载入到容器的时候调用init-method属性指定的方法
- 方法二:destroy-method:当bean从容器中删除的时候调用destroy-method属性指定的方法
-
<!--默认情况单例 scope="singleton" --> <bean id="userService" class="com.qcby.service.impl.UserServiceImpl" /> <!--多例 scope="prototype" --> <bean id="userService" class="com.qcby.service.impl.UserServiceImpl" scope="prototype" init-method="init" destroy-method="destory"/>
(3)实例化Bean的三种方式
- 无参的构造方法(默认,使用较多)
- 静态工厂
-
/** * 静态工厂方式 */ public class StaticFactory { // 静态工厂方式 public static UserService createUs(){ System.out.println("通过静态工厂的方式创建UserServiceImpl对象..."); // 编写很多业务逻辑 权限校验 return new UserServiceImpl(); } } //配置文件中的bean <bean id="us" class="cn.tx.demo1.StaticFactory" factory-method="createUs" />
-
- 动态工厂(实例工厂)
-
/** * 动态工厂方式 */ public class Dfactory { public UserService createUs(){ System.out.println("实例化工厂的方式..."); return new UserServiceImpl(); } } //配置文件中的bean //因为现在是实例(对象),如果我们要调用方法,就必须现有对象所以我们要先写出动态bean <bean id="dfactory" class="cn.tx.demo1.Dfactory" /> <bean id="us" factory-bean="dfactory" factory-method="createUs" />
-
(4)关于配置文件的名称
- 该配置文件的名字不是必须是aplicationContext,是我们自己提供的
- 可以有多个这样的配置文件
- 文件中配置的类(bean)不一定要是自己创建的类,jdk中的类也可以实现,只要这个类不是抽象的,并且提供了无参数构造方法。
(5)底层生成类的实现方法
spring的工厂生成类时其实是调用的类的构造方法,所以要想让spring给你创建对象,必须保证无参数构造方法是存在的(其实底层实现原理是反射机制)
(6)创建好的对象存储到一个什么样的数据结构当中了呢
是一个map结构,如图所示
(7)getBean()方法返回的类型是Object,如果访问子类的特有属性和方法时,还需要向下转型,有其它办法可以解决这个问题吗
//第一种,进行强制类型转换
CollectionPojo collectionPojo = (CollectionPojo) applicationContext.getBean("collectionPojo");
//直接进行反射
CollectionPojo collectionPojo1 = applicationContext.getBean("collectionPojo", CollectionPojo.class);