九、第九课 ===》 Spring如何装配各种集合类型的属性
a.关于集合类型对象怎么注入呢?
b.Set集合注入,把get方法添加到接口里,这样客户端可以访问了
Set<String> sets = new HashSet<String>;
<bean id="person1" class="com.itcast.Person">
<property name="sets">
<set>
<value>第一个</value>
<value>第二个</value>
</set>
</property>
</bean>
c.List集合注入,把get方法添加到接口里,这样客户端可以访问了
List<String> lists = new ArrayList<String>;
<bean id="person1" class="com.itcast.Person">
<property name="lists">
<list>
<value>第一个list</value>
<value>第二个list</value>
</list>
</property>
</bean>
d.Properties注入,把get方法添加到接口里,这样客户端可以访问了
Properties properties = new Properties();
<bean id="person1" class="com.itcast.Person">
<property name="properties">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
</bean>
c.Map注入,把get方法添加到接口里,这样客户端可以访问了
Map<String,Object> maps = new Map<String,Object>;
<bean id="person1" class="com.itcast.Person">
<property name="maps">
<map>
<entry key="key-1" value="value-1">
<entry key="key-2" value="value-2">
</map>
</property>
</bean>
f.循环输出,简单看帮助文档就ok了。
十、第十课 ===》 使用构造器装配属性
a.通过构造方法可以同时注入多个对象。
b.注入两种方式,一、属性注入 二、构造器注入
public PersonServiceBean(PersonDao personDao, String name){....}
<bean id="personDao" class="com.itcast.PersonDaoBean">
<bean id="person1" class="com.itcast.Person">
<constructor-arg index="0" type="com.itcast.PersonDaoBean" ref="personDao"/>
<constructor-arg index="1" value="传智播客"/>
</bean>
十一、第十一课 ===》用@Resource注解完成属性装配
a.注入依赖对象可以采用手工装配或自动装配,在实际应用中建议手工装配,
因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
b.依赖注入有三种方式---手工装配两种方式,配置文件和注解
一、使用构造器注入
二、使用属性setter方法注入
三、使用Field注入(用于注解方式)[不大使用在普通字段上注解]
c.手动装配依赖对象使用Field注入,用注解方式
前提:需要打开针对注解的解析处理器到spring容器中
导入以下命名空间 xmlns:context="http://www.***/context" .....
<context:annotatation-config/>
在导入一些jar文件lib/j2ee/commons-annotatations.jar
d.注解有两种 @Autowired 或 @Resource 注解方式进行装配
两者区别:
@Autowired默认按类型装配
@Resource默认按名称装配,当找不到名称才按类型装配,
当不提供name属性时,按注解的字段名寻找。
如找不到则按注解的类型寻找。
而且 @Autowired是spring提供的,@Resource是由j2ee提供的。推荐使用前者。
c.例子===>
通过字段方式注入
@Resource private PersonDao personDao; 在spring容器寻找personDao名称的bean,推荐这种方式
@Resource private PersonDao personDaoXX; 找不到,则按注解字段的类型查找
@Resource(name="personDao") private PersonDao personDao;
通过属性的set方法注入
@Resource
public void setPersonDao(PesonDao personDao){ this.personDao=personDao }
十二、第十二课 ===》 编码剖析@Resource注解的实现原理
a.自己创建一个注解器
b.太漂亮了,注解只是个配角,核心的是注解处理器
c.代码过于复杂,在此不熬述了
十三、第十三课 ===》 @Autowire注解与自动装配
a.依赖注入两种方式,手工装配和自动装配
手工装配有三种方式(对xml文件配置和注解设置)
一、属性装配
二、构造装配
三、注解装配
b.自动装配
<bean id="person1" class="com.itcast.Person" autowire="**"/>
** 值:byType 根据类型装配 像@Autowire,如果找到多个则抛异常,没有为null
byName 根据名称装配 像@Resource,只按名称找,找不到则为null
constructor 用于构造参数,没有找到抛异常
autodetect 采用byType 或 constructor,如果找到默认的构造器则采用byType反之....
十四、第十四课 ===》 让Spring自动扫描和管理Bean
a.自动扫描配置
需要打开针对注解的解析处理器到spring容器中
导入以下命名空间 xmlns:context="http://www.***/context" .....
<context:component-scan base-package="cn.itcast"/>会扫描指定包及地下的所有包
b.spring如何知道你哪些类要交给它管理呢??
使用注解符
@Service 业务层组件
@Controller 控制层组件
@Respository 数据访问层组件
@Component 泛指组件,不好分类
但现在spring还没做到注解的详细功能,用哪个注解符都无所谓
c.PersonService p = (PersonService)ctx.getBean("**");
** 默认根据注解的类名将首字母小写。
也可以通过注解符属性@Service("personService")
d.同样指明作用域用 @Scope("**")
指明声明周期的 @PostConstruct 初始化方法
@PreDestroy 销毁方法
十五、第十五课 ===》 使用JDK中的Proxy技术实现AOP功能
a.AOP技术 proxy [横切性关注点]
接口引用实例有什么好处???
b.AOP代理对象,主要运行在权限的管理。
c.不使用AOP框架实现AOP代理,JDK的代理技术
Proxy类的使用,代理的对象必须实现接口才允许代理。
d.代码的具体实现,请看源码,在此就不熬述了。主要了解代理的流程。
十六、第十六课 ===》 使用CGLIB实现AOP功能与AOP概念解释
a.若代理目标没有实现接口,那么可以使用一个jar实现cglib
b.具体实现代码请看源码,cglib会创建一个子类去实例
c.AOP的一些概念
Aspect(切面)
Joinpoint(连接点)
Pointcut(切入点)
Advice(通知)
Target(目标对象)
Weave(织入)
Introduction(引入)
十七、第十七课 ===》 使用Spring的注解方式实现AOP入门
a.使用spring面向切面(AOP)编程
需要导入AOP命名空间及相应的jar包
b.spring提供两种切面使用方式
一、基于XML配置方式进行AOP开发
二、基于注解方式进行AOP开发
c.本课讲基于注解方式进行AOP开发
<aop:aspectj-autoproxy/>提供一些注解的解析器
定义Aspect(切面) ====== @Aspect MyInterceptor
定义Pointcut(切入点) ====== @Pointcut("execution(* cn.itcast.service.*.*(..))") 第一个*是返回值任意
第二个*是类如果前面是..则表示包含子包
第三个*是任意方法后面括号里..表示有或无参数
切入点的名称以方法形式定义。private void anyMethod(){};
定义Advice(通知) ====== @Before("anyMethod()") 前置通知
十八、第十八课 ===》 使用Spring的注解方式实现AOP的细节
a.定义Advice(通知)
前置通知 @Before("anyMethod()")
后置通知 @AfterReturning("anyMethod()")
最终通知 @After("anyMethod()")
例外通知 @AfterThrowing("anyMethod()")
环绕通知 @Around("anyMethod()") 适合用于权限判断
b.细节处理
前置通知获得输入的参数值 @Before("anyMethod() && args(**)")
**与定义的通知方法的参数名一致,
拦截的方法就变了,只能连接限定条件的情况
后置通知获得返回的值 @AfterReturning(pointcut="anyMethod()",returning="**")
**与定义的通知方法的参数名一致,
拦截的方法就变了,只能连接限定条件的情况
例外通知获得异常信息 @AfterThrowing(pointcut="anyMethod()",throwing="**")
**与定义的通知方法的参数名一致,
拦截的方法就变了,只能连接限定条件的情况
十九、第十九课 ===》 使用Spring配置文件实现AOP
a.通过XML文件配置实现AOP
b. <bean id="aspectBean" class="cn.itcast.service.impl.MyInterceptor"></bean>
<aop:config>
<aop:aspect id="asp" ref="aspectBean">
<aop:pointcut id="mycut" expression="execution(* cn.itcast.service.*.*(..))"/>
<aop:before pointcut-ref="mycut" method="doAcessCheck"/>
<aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
<aop:after pointcut-ref="mycut" method="doAfter"/>
<aop:around pointcut-ref="mycut" method="doBaseponn"/>
</aop:aspect>
</aop:config>
方法是切入面的方法。
c.主要使用在权限系统和运行期监控...
二十、第二十课 ===》 aspectj的切入点语法定义细节
a.<aop:pointcut id="mycut" expression="execution(* cn.itcast.service.*.*(..))"/>
对表达式简单介绍,
只拦截返回值为Sting的方法 execution(java.lang.String cn.itcast.service.*.*(..)
拦截的输入参数至少第一个为String execution(* cn.itcast.service.*.*(java.lang.String,..)
拦截的返回值不为void的所有方法 execution(!void cn.itcast.service.*.*(..)
二十一、第二十一课 ===》 搭建和配置Spring与jdbc整合的环境
a.配置Spring与jdbc整合有两步骤
第一步:配置数据源
第二步:配置事务(注解方式、XML配置方式)
b.导入tx命名空间,开启注解的处理器
c.步骤很完美。主要做CRUD
二十二、第二十二课 ===》 Spring集成的jdbc编码和事务管理
a.使用JdbcTemplate类,是spring提供的,提供很多包装方法
b.配置文件修改属性可以提取出位一个properties文件保存,配置一个节点
c.使用${url}
d.@Transactional启动让spring进行事务管理
二十三、第二十三课 ===》 使用Spring注解方式管理事务与传播行为详解
a.了解spring对事务的管理,
默认unchecked 和 checked 异常事务如何处理,前者回滚后者不回滚
b.也可以指定具体的事务处理
@Transactional(noRollbackFor=RuntimeException.class.....)
c.select语句无需开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
d.事务隔离级
Read Uncommited 读未提交数据(会出现脏读,不可重复读和幻读)
Read Commited 读已提交数据(会出现不可重复读和幻读)
Repeatable Read 可重复读(会出现幻读)
Serializable 串行化
脏读:一个事务读取到另一事务未提交的更新数据
不可重复读:同一事务多次读取同一数据返回的结果有所不同
可以读取到后续的已提交的更新数据
可重复读:不可以读取到后续的已提交的更新数据
幻读:一个事务读取到另一事务的已提交的insert数据
事务隔离级别越高则效率越高。
e.sqlserver 2000默认是Read Commited级别
sqlserver 2005默认是Repeatable Read级别+快照技术可实现Read Commited级别
二十四、第二十四课 ===》 使用Spring配置文件实现事务管理
a.简单看源码
b.建议项目采用注解方式进行事务管理,避免配置文件的臃肿
二十五、第二十五课 ===》 搭建和配置Spring与Hibernate整合的环境
a.准备Spring2.5+Hibernate3.3+Struts1.3整合开发
b.别一起整合,一般先Spring+Hibernate整合
c.简单看视频
二十六、第二十六课 ===》 Spring集成的Hibernate编码与测试
a.persist merge 是JDK的规范,比save update
b.熟悉了实际开发的模式,创建完业务bean后,
别急着创建控制层,通过单元测试测试一下。
c.测试类可以通过接口生成单元测试。
d.对hibernate的一些方法了解了。load、currentSession
二十七、第二十七课 ===》 Struts与Spring集成方案1(Struts集成Spring)
a.结合struts框架
b.jstl JavaServer Pages Standard Tag Library
提供了范围广泛的通用tag,这些tag极大地方便了Web层的开发
c.Servlet规范不同使用的tomcat版本不同,j2ee5.0 的servlet规范必须在tomcat6.*使用
d.太漂亮了!!了解了myeclipse提供的服务平台,文件系统。
二十八、第二十八课 ===》 Struts与Spring集成方案2(Spring集成Struts)
a.如何将业务层的bean注入到控制层action??
b.配置struts-cfg.xml添加一个控制器
c.bean的name属性的值与struts中的path值一样
d.用户请求后ActionServlet-->请求处理器 --->获取action对象
--->Spring容器寻找,找不到则交给struts容器
二十九、第二十九课 ===》 为Spring集成的Hibernate配置二级缓存
a.二级缓存第二次访问时如果前面已访问了,就只从内存中访问
b.案例做的太成功了,使用了Thread.sleep(1000*15);在休眠时关闭书籍库
c.在企业应用中二级缓存还是经常用到的。掌握...
三十、第三十课 ===》 Spring提供的CharacterEncoding和OpenSessionInView功能
a.乱码处理添加一个filter的Servlet
b.延迟加载问题也是加filter,实际很有用
三十一、第三十一课 ===》 使用Spring集成JPA
先越过
三十三、第三十三课 ===》 使用Spring集成Struts2
a.Spring2.5+Hibernate3.3+Struts2整合开发
b.完了
思考:
接口引用实例有什么好处???
答:这个问题是我第二天在传智去的时候,8点到的,们还没开,后来上楼碰见了:偶像-张孝祥老师,我问了张老师,张老师说这样,这样当修改实现类时,不用修改接口,这样方便维护。张老师还说了很多,我这记性不太好,还没总结出来,希望大家多多指点!
本教程涵盖Spring框架的基本使用,包括集合类型属性装配、构造器装配、依赖注入、自动装配、AOP功能实现、与JDBC和Hibernate整合等内容。

576

被折叠的 条评论
为什么被折叠?



