Spring
框架--别人封装好供我们使用
1.下载jar
2.搭建到我们的开发环境中
3.Spring最主要的学习内容
IOC Inversion Of Control 控制反转
DI Dependency Injection 依赖注入
AOP Aspect Oriented Programming 面向切面
(Object Oriented Programming)
SpringJDBC 只有jdbc 没有连接池 有bug
4.导包
spring-beans
spring-context
spring-core
5.BeanFactory factory = new ClassPathXmlApplicationContext("");
//全局上下文管理对象 写在xml文件里
6. Student = (Student)factory.getBean("student");
异常 classNotFind org.apache.commens.Loggin.LogFactory
Expression
依赖项
后续用maven就没问题了
痛点
bean列表过长
1.全局上下文接收参数可接受多个参数列表(载入多个xml文件)
("","","","") //String 动态参数列表
(new String[] {"",""}) //String 数组
2.通配符
ApplicationContext*.xml
3.主配置文件引入其他配置文件
主配置中
想要某些多例
spring管理的这些对象默认单例
单例模式底层---生命周期托管的方式(Servlet)
单例模式可修改
3.立即加载/延迟加载
单例模式默认立即加载(SpringBean工厂创建时)
原型模式,对象在工厂创建时不会创建,要的时候创建
平时开发更多使用延迟加载
4.对象中有属性 自动将属性值赋上
属性很多 int string
属性如果是个对象
属性万一是个抽象/接口
属性是集合??
-----------------------
5.对象交给spring管理--IOC
对象中可能有一些属性,自动帮我们把属性赋值
set赋值
/
xxx
构造方法赋值
最好写type 写了就不用根据反射去推测 效率会高
我们管理的对象更可能是dao service controller这种的
他们内部还有其他的对象
对象创建的同时能自动帮我们把属性值注入进去
控制翻转IOC 依赖注入DI
面向切面 AOP.
DI
某一属性为空
某一属性中 有特殊字符 string 写value标签内
内部一律当做字符串
一个bean内部有一个bean
//项目内统一
也可以bean嵌套写法 (这样不能直接访问子bean,但可以fatherbean.getPrivateBean)
另: fatherbean内可以直接property name = "childbean.propname" …进行赋值
自动装配
构造方法
aaa
//2
List
aaa
set集合相似
map
properties
某一个bean对象中有一个属性是Properties类型(本质就是个map)
value
同一个属性 可以同时配置构造方法和set方法赋值,但最终适用set(后执行)
命名空间
标签配置过程中,为简化配置文件写法
spring提供以下方式
命名空间
property P:
constructor-arg c:
有了这种命名空间规范后,可以将原来嵌套在bean标签中的两个属性 放在bean标签中
//
...
//命名空间都需要导标签
p:map-ref="xx"
AOP 面向切面编程思想
重要概念
起始对象(main 程序开始 发送请求)
目标对象(Target Object)
切面对象(Aspect)
代理对象(AOP Proxy Spring容器帮我们创建的 用来管理切面对象)
切点(切入点 Pointcut 目标对象中的方法 目标 切面-观察 目标做了件感兴趣的是 观察者设计模式)
连接点(Join Point 切面对象中的方法)
建议/通知(advice 连接点中执行的过程)
前置 before
后置 after-returning
异常 after-throwing
最终 after
环绕 around
配置
//写在标签内外都一样,写在里面是为了好看
注解开发
替代bean标签
@Component("") //相当于bean 和 id
@Controller
@Service
@Reponsitory
@Scope(value = "default/singelton/.." scopeName = ""
)
@Lazy(value = "true") //true是懒加载 false或不写立即加载
@PostContructor 方法上 对象加载就执行
@PreDestory 方法上 对象销毁执行
做bean的DI注入
//属性或set上
@Autowire
可放在构造方法上(调) set方法(调) 属性上(反射)
先找属性名 再找名字 再找类型 多了没有都不行
@Qualifire("") 实现对一个对象注入微调 填谁注谁
--@Resources("bea8nid") 需要导包 不是spring家族 维护麻烦
@Value("值") 还支持SpEL @Value("${}")
不是我们创建的类 但也想通过Spring管理
注解类
@Configuration
@ComponentScan(basePackages = {"controller","dao",".."})
@Bean(value = "") 但如果同名 就不用加value了
BeanFactory beanFactory = new AnnotationConfigApplicationContext(xxxConfigClass.class);
@PropertySource("ClassPath:jdbc.properties")
@Value("${user}")
... Spring底层也有个username 一般这个用别的key 默认Administrator
import org.springframwork.context.annotation.ComponentScan
import ...Configuration;
im... ..Import;
@import(ConfigClass.class)
1.注解用于替代原有的bean标签
@Component() -
MVC架构分层更加清晰
控制层@Controller
业务层@Service
持久层@Reponsitory
2.用于替代原有bean标签中的属性 对象管理的机制
@Scope("singleton/prootype")
@Lazy(true/false)
@PostContructor method-init 当前对象创建时 执行一个方法
@ProDestory method-destory ..销毁..
3.用于对象创建后的自动注入
@Autowired byName -> byType
@Qualifire 搭配上面注解进行注入微调 指定上面其中一个
@Value 属性是个具体的值 支持SpEL
@Resource 相当于1、2合体,必须指定名字 不是spring家族的
4.以上注解都是些在自己定义的类中
有些时候类不是我们写的 JdbcTemplate DataSource
还想通过注解进行管控这些对象
1. 自己定义类
类中自己定义方法,作用是为了创建那些需要管控的对象
方法通常有返回值,就是那些类的对象
方法上面添加@Bean
2. 需要在自己写的类上面加个注解 -> 核心xml一样
@Configuration
3. 改变了读取xml的过程 创建工厂方式也要相应改变
BeanFactory factory = AnnotationConfigApplicationContext(xx.class)
4. 如果想添加一些外部文件中的内容
内容可以用SpEL来读
5. 自定义类中可能有很多方法
可以将自定义类拆分 还多个小配置类
@Import(xxx.class)引入小配置类
小知识
加载beanFactory时候的类
有好几个
ClassPath...
FileSystem..
SystemPath 系统路径 当前电脑 c d
ProjectPath 工程路径 写源代码的地方 不是最终字节码位置
ClassPath 真实类路径 字节码所在地方 字节码文件信息加载入内存

浙公网安备 33010602011771号