Spring 2018-10-11

1.Helloworld

利用配置文件(Bean.xml)进行类的配置,利用全类名进行反射的方式进行类的创建

ApplicationContext ctx =new ClassPathXmlApplicationContext("Beans.xml");类路径下的配置文件

<bean id="helloworld" class="com.HelloWorld.HelloWorld">

    <property name="name2" value ="Spring">

</bean>

其中,name的值为setProperty中set后面的值,可与具体变量名不同,即setName2设置的是name属性的值。

2.Bean的配置

IOC(Inversion of Control)控制反转:反转资源获取的方向。容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源。

DI(Dependency Injection)依赖注入:组件以一些预先定义好的方式( ( 例如 : setter 方法) ) 接受来自如容器的 资源 注入

2.1 配置bean

class:bean的全类目,通过反射的方式在IOC容器中创建bean,要求bean中必须有无参数的构造器

id:通过id来获取bean的实例,id值唯一

2.2Spring 提供了两种类型的 IOC 容器实现

–  BeanFactory: IOC 容器的基本实现.面向Spring本身,Spring基础设施

–  ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子

接口.几乎所有的应用场合都直接使用。面向使用 Spring 框架的开发

2.3ApplicationContext 代表IOC容器

ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。

实现类:

ClassPathXmlApplicationContext:从类路径下加载xml配置文件

FileSystemXmlApplicationContext: 从文件系统中加载配置文件

2.4获取Bean的方式

-可通过id获取

-可通过类的类型获取,但要求IOC容器中必须只能有一个该类型的Bean

2.5.依赖注入的方式

-属性的注入:通过setter注入

<property name="name2" value ="Spring"></property>

字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。

-构造方法注入:通过构造器注入,可指定参数的位置和类型,以区分重载的构造器
<constructor-arg value="audi" index="0"/type="java.lang.String"></constructor-arg>

2.6引用其他的类

-以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.

<ref bean="car2"><property name="" ref="car2">

-也可以 在属性或构造器里包含 Bean 的声明, 这样的 Bean称为内部 Bean.不用写id,其他都一样,不能够被外部引用,只能在内部使用。

2.7为级联属性赋值

属性需先初始化才可以进行赋值,否则异常

<property name ="car.maxspeed" value=""></property>

2.8集合属性

在 Spring中可以通过一组内置的 xml 标签(例如: <list>,<set> 或 <map>) 来配置集合属性.

</list>

    <ref bean="car">

    <ref bean="car">

</list>

<map>

<entry key="aa" value-ref="car"></entry>

<entry key="bb" value-ref="car2"></entry>

</map>

<property name="properties">

        <prop key="name">root</prop>

</property>

-配置单例的集合bean,以供多个bean进行引用,利用ref=cars可以引用

<util:list id="cars">

    <ref bean="car">

</util:list>

2.9 p空间

<bean id="person3" class="com.collection.Person" p:age="30" p:name="hahaha" p:cars-ref="cars">

3.自动装配

<bean id="person" class="com.autowire.Person" autowire="byName" p:name="hahaha"></bean>

4.Bean 之间的关系

继承配置bean:子bean从父bean中继承配置,也可覆盖配置

<bean id="address2" p:street="lanbailou" parent="address"></bean>

抽象Bean:只能用来进行继承配置,不能IOC容器被实例化

<bean id="address" class="com.autowire.Address" abstract="true"></bean>

若class属性没有指定,则必须为抽象bean,必须指定abstract=true

依赖关系:

depends-on=“car,person” 前置依赖car和person的bean,需在本bean实例之前创建好

5.Bean的作用域

<bean id="car" class="Car" p:brand="brand" scope="prototype"></bean>

singleton:默认,单例,容器初始化时创建实例,整个生命周期内只创建一个

prototype:只有获取实例的时候创建新的实例,容器初始化时不创建

6.使用外部属性文件

<context:property-placeholder location="classpath:db.properties"/>导入资源文件

创建外部文件db.properties   文件中内容为:price=test_properties

利用<property name="brand" value="${price}"></property>格式调用

7.spel

value=“#{' hhhh '}”

8.IOC容器中Bean的生命周期

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

– 通过构造器或工厂方法创建 Bean 实例

– 为 Bean 的属性设置值和对其他 Bean 的引用

将 Bean 实例传递给 Bean 后置处理器的postProcessBeforeInitialization 方法

–  调用 Bean  的初始化方法

将 Bean 实例传递给 Bean 后置处理器的postProcessAfterInitialization方法

– Bean 可以使用了

–  当容器关闭时,  调用 Bean  的销毁 方法

Bean的后置处理器

类实现BEANPostProcessor接口,并具体提供以下两个方法的实现

返回bean,可在方法中修改方法的bean,该处理器适用于所有的bean

init之后和init之前的方法

不用配置id,ioc自动识别

<bean class="BeanPostProcessor"></bean>

9.通过工厂方法配置Bean
10.通过factoryBean配置Bean

自定义factoryBean需要实现接口

通过factorybean来配置bean的实例,class指向factorybean的全类名

11.配置基于注解的方式

组件扫描(component scanning): Spring 能够从classpath 下自动扫描, 侦测和实例化具有特定注解的组件.

特定组件包括:

– @Component: 基本注解, 标识了一个受 Spring 管理的组件

– @Respository: 标识持久层组件

– @Service: 标识服务层(业务层)组件

– @Controller: 标识表现层组件

对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写.  也可以在注解中通过 value  属性值标识组件的名称。

Spring 的配置文件中声明:

<context:component-scan base-package="com.annotation" resource-pattern="repository/*.class"></context:component-scan>

两个属性

base-package:扫描包及子包下的文件

resource-pattern:指定路径的资源

子节点:

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:exclude-filter>指定排除哪些指定表达式的组件

<context:include-filter type="assignable" expression="接口名(不包含接口和接口所有实现类)"></context:include-filter>只包含表达式的组件,属性 use-default-filters=false才起作用

组件装配:

@Autowired 注解自动装配 具有兼容类型的单个 Bean属性

默认情况下, 所有使用@Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean  装配属性时,  会抛出异常,  若某一属性允许不被设置,  可以设置@ Authwired 注解的 required  属性为 false。

当 IOC 容器里存在多个类型兼容的 Bean 时

1.可通过value设置为接口名,自动装配该实现类

2.@Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @ Qualifiter 已指定注入 Bean  的名称

12.泛型依赖注入

类中包含接口,通过泛型的类型寻找具有同样泛型类型的实现类

同样的<User,使UserService和UserRepository配对

13.AOP 面向切面编程

joinPoint参数访问到连接细节

1.XML文件配置,使注解起作用

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

2.切面:

@Component:把类放入IOC容器中

@Aspect:定义为切面

@Before("execution(public * com.aop.helloworld.*.*(..))")

AspectJ 支持 5 种类型的通知注解:

–  @Before: 前置通知, 在方法执行之前执行

–  @After: 后置通知, 在方法执行之后执行,不能访问返回结果

–  @ AfterRunning: 返回通知, 在方法返回结果之后执行

–  @ AfterThrowing: 异常通知, 在方法抛出异常之后

–  @Around: 环绕通知, 围绕着方法执行

返回通知
异常通知

环绕通知:

1.需要携带ProceedingJoinPoint类型参数

2.必须有返回值,返回值即为目标方法的返回值

环绕通知

切面优先级:

@Order(数值,值越小,优先级越高)

13.2 声明切入点表达式

@Pointcut("execution(public * com.aop.helloworld.*.*(..))")

public void declareJoinPointExpression(){}

@Before("declareJoinPointExpression()")其他通知直接使用方法名来引用切入点表达式

优点:便于修改切入点表达式

14.Spring 对Jdbc的使用

配置c3p0数据源

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${jdbc.driverClassName}"/>

    <property name="url" value="${jdbc.url}"/>

    <property name="username" value="${jdbc.user}"/>

    <property name="password" value="${jdbc.password}"/>

</bean>


<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>VALUES(?,?,?)

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"<constructor-arg ref="dataSource"/>带参数VALUES(:lastName,:email,:dpetId)


15.Jdbc中的事务声明

事务:一系列动作,单独的工作单元。要么全部完成,要么都不完成。

-原子性

-一致性

-隔离性

-持久性

<!--配置事务管理器管理-->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource">

<!--启用事务注解-->

<tx:annotation-driven transaction-manager="transactionManager"/>

注解:

@Transactional

事务的传播行为

@Transactional(propagation = Propagation.REQUIRED)

propagation 指定传播行为,默认取值为required,即使用调用方法的事务

事务的隔离级别

@Transactional(isolation = Isolation.DEFAULT)

– 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

– 不可重复读:对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

– 幻读:对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表,就会多出几行.

回滚事务属性

@Transactional(noRollbackFor ={AccountException.class})

默认情况下spring的声明式事务对所有的运行时异常进行回滚

只读属性:

@Transactional(readOnly =true)只读数据不更新数据

超时属性:

@Transactional(timeout =1)事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源(秒为单位)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容