1.bean的继承
这里的继承,不是java类里面的extends继承,更多的类似模板,父bean可以是一个不实际用到的bean,可以仅仅只当做一个模板:
abstract="ture"作为抽象模板的bean就只能被继承,不能实例化.
子类继承父bean的所有除了abstract以外的属性,也能重写
如果一个bean没有class属性,那么这个bean必须是一个抽象bean
视频教程里面给的demo的NameSpace给的是schema-p,正如之前所讲的,用p代替了property
2.bean的依赖
用depends-on依赖了一个bean,那么这个bean必须存在,如果依赖的bean不存在,自己也无法初始化,这里的依赖称之为前置依赖
3.作用域scope
spring里面的bean的作用域有4种,其中前2种比较常见,后2种用的很少,默认的作用域是singleton
1.singleton -->在整个IOC的生命周期内
2.prototype 可以重复产生bean,每次都是新的bean,这个时候注意,这个时候的模式是懒汉式,singleton是饿汉式
3.request
4.response
4.使用外部部署文件
在配置bean的同时,是还需要在spring的那个xml文件里面配置系统部署的相关配置信息的
这个demo里面示范了导入一个c3p0的线程池 + mySQL驱动connector的jar包
记得之前看springBoot的时候,也看到过db.properties的配置文件.里面有很多数据库配置
Spring提供了一个叫做PropertyPlaceholderConfigurer的类,允许把部分的配置信息,外移到外部的属性文件中
步骤:
1.先导入外部属性文件
2.引用,使用${var}占位符,引用的时候,这里的var,就是db.properties里面的变量名
5.SpEL-->spring的表达式
应用的非常少,界定符为: #{...}
用SpEL实现字面值,意义不到
SpEL可以引用类的静态属性,bean的调用,bean的链式调用,以及一些简单的语法表达式,value="#{beanName}"
上面最后这一种,为动态复制
实际上,SpEL并不需要太了解
6.bean的生命周期
Tomcat是servlet的容器
这里有2个方法:
init-method
destroy-method
一个是在bean初始化的时候调用的,一个是在bean销毁的时候调用的
init方法,放在xml专门的init方法里面-->init-method
同样的destroy方法也放在xml的destroy里面-->destroy-method
7.关闭容器
这里,ApplicaitonContext是无法关闭容器的,ApplicationContext有不少实现类,这些实现类,有不少还不知道如何使用
在这里用ClassPathXmlApplicationContext是可以.close()的.
8.bean的后置处理器
这里需要去实现一个接口BeanPostProcessor
实现了这个接口以后就有了2个重写方法:
一个是在初始化之前对bean进行处理,还有一个是在初始化之后对bean进行处理,两者都会返回一个bean
这里的BeanPostProcessor是对所有的bean都进行处理,所以具体,可以对bean先进行过滤
配置的话,只需要写一个bean后面的class是processor就可以了
看来spring的配置注意事项还是很多的...有点麻烦...
9.工厂方法配置bean
静态工厂方法:
之前在安卓见的太多了,大部分都是这种,调用一个类的静态方法,就可以返回这个类的实例对象
补充一下,静态代码块优先于构造器执行,然后只会执行一次
这里就相当于,我想创建一个bean,然后这个bean,是通过java代码里面的另一个类的静态方法拿到的...所以在xml里面就要定义一个
factory-mehtod
如果这个时候需要传参数的话,用<constructor-arg>就可以了
实例工厂方法:
这里需要在xml里面再创建一个bean,用到factory-bean和factory-method,本质上就是拿到bean以后再拿bean里面的对象
没啥意思...用脚想都知道,之前SE类各种注入,调用的功能,这里bean肯定也应该有相对应的
10.通过FactoryBean来配置工方法
这里需要实现BeanFactory,然后传入bean类型
然后会重写3个方法:
1.返回对象
2.返回对象所属类
3.是否为单例
其实也就是通过工厂方法,集中的拿工厂Bean里面的很多obj
class指向了实现了BeanFactory的类,但是拿到的是这个类下面的所有objs
11.基于注解(主流)
1.组件扫描:
扫描的特定组件包括如下:
-@Component:基本注解,标识了一个受Spring管理的组件
-@Reposity:标识持久化层组件(数据库)
-@Service:标识业务层组件
-@Conroller:标识表现层组件
spring在注解注入bean的这个方案上,有一个命名策略,比如一个类UserService,其在ioc容器里面的bean名就是userServie,首字母小写,或者在注解里面指定组件名称
这里需要注意了,xml配置bean,纯粹是按照bean来配置的,层级已经是最小单位了,但是在这里,用注解,是明显的按照整个spring的功能层级来配置的,所以按照这个层级,肯定会是要比xml配置更简单的
12.scan
需要在spring的配置文件中声明<context:component-scan>;
扫描其包的各个子包,多个包的话用逗号隔开
13.在写bean的xml文件的时候,注意这里要导入context的命名空间
然后指定spring IOC容器扫描的包
在spring写了一个component-scan然后后面的base-package写好要扫描的基包,下面的子包自然都会扫描
这里注意一点啊,子包就是"."后面的各种同级或子级子包
14.扫描过滤
这里用到了 resource-pattern属性来过滤特定的类
resource-pattern="repository/*.class"只扫描,repository下面的
这里,如果是没有扫描出来的类,自然也不能用,因为没有注入到ioc容器里面
15.进一步过滤:
使用
<context:include-filter>子节点表示要包含的目标类
<context:exclude-filter>子节点表示要排除的目标类
这里还要写表达式,写这个子节点的时候,有一个type,type类型写:annotation,表示是通过注解的,然后这里expression表达式写的需要排除组件的类型,而不是包名,这里需要注意了,而使用assignable的后面的class则是写自己创建的class.
还有一点,这里有一个属性use-default-filters,在这里默认是true,他会都扫描,这里应该设为false
Filter Type | Examples Expression | Description |
annotation | org.example.SomeAnnotation | 符合SomeAnnoation的target class |
assignable | org.example.SomeClass | 指定class或interface的全名 |
aspectj | org.example..*Service+ | AspectJ語法 |
regex | org\.example\.Default.* | Regelar Expression |
custom | org.example.MyTypeFilter | Spring3新增自訂Type,實作org.springframework.core.type.TypeFilter |
一般只用前2个
用注解方法来注入bean还有一点就是,在@("")后面还可以指定bean在容器里的id值
16.上面讲了孤立的注解bean到IOC,下面要接着讲,通过注解方式,对bean进行关联
这里是用Autowire来代替在普通的java项目中的构造器注入
等于说,在某个类的全局变量没有注入的时候加了autowire,那么spring就会自动的在ioc容器里面找有没有符合条件的bean,然后自动的进来,这里的bean就是单例
如果这个IOC里面没有这个bean,那么还要额外设置required="false",这样即使ioc没有这个bean也不会抛异常
放在set方法上也是可以的
那如果某个bean里面的全局变量不是一个具体的实现类,而是一个接口类,那么需要你的实现类的名字的标记@("")后面的括号里面写了这个接口名,不然的话无法识别,因为有2个实现类.如果那2个实现类,都没有写名字,那么在关联bean的时候,在@Autowire下面还需要写一个@Qualifier("实现类类名"),这个qualifer还可以加到入参的前面.......
这样反倒看不清楚了,还是加在java代码的全局变量前面
17.
还有把@Autowire装配在:
1.数组类型,会把匹配的bean全部装配
2.集合属性,自动装配与之兼容的bean
3.Map,如果是map,那么key=bean的名字,value值就是bean本身
进度:
一共36,目前看到15,明天周二计划看到20,周三25,周四30,周五36,周六开始搞SpringMVC