3.24 spring 学习笔记
学习 spring , 先引入 依赖
spring-core.jar spring核心配置 , ioc , aop 均在这个包里
spring-beans.jar spring 处理 java 类的 工具包
spring-context.jar spring 上下文
spring-expression.jar spring 处理表达式
commons-logging.jar spring 的日志依赖的jar
注意 以上 spring 开头的jar 需要版本号 一致 具体看 pom.xml
mybatis 需要 mybatis-config.xml
spring 需要 applicationContext.xml
IOC 与 AOP
IOC: 控制反转 也 称为 依赖注入
AOP: 面向切面的编程
3.27 Spring ioc
spring ioc 的底层 应用的是 java 的反射机制
要求 每个bean 至少包含 2个 构造器, 其中 必须 得有 无参构造器
spring ioc 基于xml 方式-----重点
a.基于xml方式 get/set 注入属性 --- 属性 必须 得有 get/set
b.基于xml 方式, 构造方法 注入属性 ---- 必须得有 带参数的构造方法
c. 基于p命名空间 p---- property
需要为 spring的配置文件, 引入 p 命名空间
xmlns:p="http://www.springframework.org/schema/p"
然后呢 通过 p:属性名="值" 进行 注入
模拟 java web 中 service 调用 dao
练习:
创建 spring1_2 module
实现 service 调用 dao 实现 员工的增加
显示方式: 控制台 打印输出 service -----add, dao--------add
总结:
基于xml 方式:
在spring的配置文件中 ,要配置 bean 的class 为 实现类 而不是 接口
在 测试类中, 通过 多态的向下转型 来获得 接口实例
接口类型 对象名= context.getBean();
spring 创建bean 的生命周期:
通过 Dept.java 来举例
-
调用无参构造
-
调用属性的set 方法
-
调用 init-method 对应的方法,进行初始化
-
做具体的操作
-
调用 destroy-method对应的方法,进行销毁
spring 的自动装配, 为 bean 标签 增加 autowire属性 , 该属性 有2个值 byName, byType
自动装配分为 2种, 基于 名字 或者 类型
a.基于名字的自动装配 autowire="byName"
注入时, 属性名 必须为 另一个bean的 id 属性
b.基于类型的自动装配 autowire="byType"
注入时, 属性名 可以与bean的id 属性 不一致, 因为按照类型 匹配
spring 配置 数据源,
引入 druid.jar
编写 db.properties
编写spring 的配置文件
spring ioc 基于 注解方式-----重点
注解: 简化 java 配置
@Override 重写
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
进行 包的扫描
<context:component-scan base-package="dao,service"/>
@Autowired 通过 类型注入 byType
@Qualifier("bean的id") // 按照 名字映射 byName
service 调用 dao 来做示例
3.28 AOP
IOC: 控制反转
AOP: 面向切面的编程,
通俗的说,在不改变源代码的情况下 增加新功能.
AOP 实现代理的形式 有 jdk 动态代理与 cglib代理
当项目中有 接口时, 采用 jdk 动态代理
若没有接口 , 采用 cglib 动态代理
以 DeptDao.java 为例
基于xml 的 aop 的步骤:
内容: 调用 User.java 中的print() 方法时, 打印另外的输出内容 ---采用 aop 方式 实现
a. 引入 jar,
spring-aop.jar , aspectjweaver.jar
b. 编写 两个类, User.java 定义 print() 方法 ,
UserProxy.java 定义 beforeInvoke()方法;
c. 在 spring 的配置文件中 增加 aop 配置
引入 aop 的命名空间
增加 <aop:config>
在这个标签里 配置 切入点与切面
切入点 配置 User.java 定义 print()
切面 配置 UserProxy.java 定义 beforeInvoke()方法 并定义 通知类型