Spring Framework
java中创建对象的方法:
-
构造方法,new student()
-
反射
-
序列化
-
克隆
-
IOC:容器创建对象(不需要在代码中创建对象)
-
动态代理
ioc的体现:
servlet:
1. 创建类继承HttpServelt
2. 在web.xml注册servlet,使用<servlet-name> myservlet </servlet>
<servlet-class> com.bjpwernode.controller.MyServlet </servlet-class>
3. 没有创建servlet对象,没有MyServlet myservlet = new MyServlet()
4. servlet是Tomcat服务器创建的。Tomcat也称为容器
Tomcat作为容器,里面存放的右servlet对象,Listener,Filter对象
IoC的技术实现:
DI 是IOC的技术实现
DI(Dependency Injection): 依赖注入,只需要在程序中提供要使用的对象名称就可以
Spring使用di实现了IOC的功能,底层创建对象使用反射机制
spring是一个容器,管理对象,给属性赋值,底层是反射创建对象。
Spring中的bean
bean是根据scope来生成,表示bean的作用域,scope有4中类型:
singleton,单例,表示通过Spring容器获取的对象是唯一的
prototype,原型,表示通过Spring容器获取的对象是不同的
request,请求,表示在一次http请求内有效
session,回话,表示在一个用户会话内有效
request,session适用于Web项目
singleton模式下,只要加载IoC容器,无论是否从IoC中取出bean,配置文件中的bean都会被创建。
prototype模式下,如果不从IoC中取bean,则不创建对象,取一次bean,就会创建一个对象
Spring的继承
spring的继承不同于java中的继承,区别:java中的继承是区别于类的,spring的继承是针对对象(bean)
spring中的继承,子bean可以继承父bean中的所有成员变量的值。
通过设置bean标签的parent属性建立继承关系,同时子bean可以覆盖父bean的属性值。
spring的继承是针对对象的,所以子bean和父bean并不需要属于同一个数据类型,只要其成员变量列表一致即可。
Spring的依赖
IoC容器默认情况下是通过spring.xml中的bean配置顺序来决定创建顺序的,配置在前面的bean会先创建。
在不更改spring.xml配置顺序的前提下, 通过设置bean之间的依赖关系(depends-on)来调整bean的创建顺序
Spring读取外部资源:
数据库的配置文件一般保存在以properties为后缀的文件中,
Spring P 命名空间
Spring 工厂方法:
IoC通过工厂模式创建bean:
静态工厂方法(不需要实例化)
factory-method指向静态方法
constructor-arg的value属性是调用静态方法传入的参数
实例工厂方法(需要实例化)
区别:静态工厂方法创建Car对象,spring.xml中只需要配置一个bean,即最终的结果Car即可;
实例工厂方法创建Car对象,spring.xml中需要配置两个bean,一个是工厂bean,一个是Car bean
Spring IoC 自动装载autowire
自动装载是Spring提供的一种更加简便 的方法完成DI,不需要手动配置property,IoC会自动选择bean完成注入。
有两种方式:
byName
byType
Spring IoC基于注解的开发
-
配置自动扫包
-
添加注解
基于注解的方式,默认的类名称的首字母小写
DI操作使用@Autowire注解
@Autowire默认是通过byType进行注入的,如果要改为byName,需要配置@Qualifier注解完成。
表示将IoC中id为ds的bean注入到repository中
实体类中普通的常用变量可以通过@Value注解进行赋值
实际开发中程序会分三层
Controller
Service
Repository(DAO)
@Compoment注解是将标注的类加载到IoC容器中,实际开发中可以根据业务需求分别使用@Controller、@Service、@Repository注解来标注控制层类、业务层类、持久层类。
Spring IoC底层原理
核心技术点:XML解析 + 反射
具体思路:
-
根据需求编写XML文件,配置需要创建的bean
-
编写程序读取XML文件,获取bean相关信息,类、属性、id
-
根据第2步获取到的信息,结合反射机制动态创建对象,同时完成属性的赋值
-
将创建好的bean存入Map集合,设置key-value映射,key就是bean中id值,value就是bean对象
-
提供方法从Map中通过id获取对应的value
Spring AOP(Asprct Oriented Programming)面向切面编程:
AOP是对OOP的一个补充,是在另一个维度上抽象出对象。
具体是指程序运行时动态地将非业务代码切入到业务代码中,从而实现程序的解耦合,将非业务代码抽象成一个对象,
对对象编程就是面向切面编程。
AOP的有点:
可以降低模块之间的耦合
提高代码的复用性
提高代码的维护性
集中管理费业务代码,便于维护
业务代码不受非法业务代码的影响,逻辑更加清晰
@Component,将切面类加载到IoC容器中
@Aspect,表示该类是一个切面类
@Before,表示方法的执行时机是在业务方法之前,execution表达式表示切入点
@After
@AfterReturning
@AfterThrowing
aop:aspectj-autoproxy,Spring IoC容器会结合切面对象和委托对象自动生成动态代理对象,AOP底层是通过动态代理机制实现的。
AOP概念:
切面对象:根据切面抽象出来的对象,Callmpl所有方法中需要加入日志的部分,抽象成一个切面类LoggerAspect
通知:切面对象具体执行的代码,即非业务代码,
目标:被横切的对象,将通知加入其中
代理:切面对象、通知、目标混合之后的结果,即我们使用JDK动态代理机制创建的对象
连接点:需要被横切的位置,即通知要插入业务代码的具体位置