25-Spring_Basic-2

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值