●什么是IOC(DI),有什么好处
·把自己new的东西改为由容器提供
1)初始化具体值
2)装配
·好处:灵活装配
·spring是什么 类与类之间的关系只要在xml中配置好,
调用ClassPathXmlApplicationContext的getBean方法,
就可以得到一个装配好的类的对象。
●简单项目搭建
·xml src目录下 beans.xml
·引入spring包
1)spring-framework-2.5.6/dist/spring.jar 核心包
2)spring-framework-2.5.6/lib/jakarta-commons/commons-logging.jar 日志包
·使用时写明配置文件的位置
●spring的注入类型
·setter注入
在被注入的类写好成员变量的set方法,由容器调用此方法注入到类中。
·构造方法注入
用构造方法的参数在构造方法中初始化此成员变量
●bean中的id和name
其实id和name是一样的 name里可以有一些特殊字符
●简单属性注入(少用)
在被注入的类写好成员变量(简单属性而非对象)的set方法
●bean的作用域
scope可以取singleton单例 prototype一个bean定义对应多个实例
多用prototype
●集合注入
注入的成员变量是一个集合
●自动装配
autowire为自动装配,可以为此对象自动装配其成员变量
·byName 找bean的name和成员变量的名字相同则初始化,名不同报错
·byType 找bean的class和成员变量的类型一样则初始化,多了报错
●延迟初始化bean
此时bean在applicationContext初始化时不初始化(new ClassPathXmlApplicationContext时)
●初始化时执行的方法指定 容器初始化bean的时候 调用
●结束时执行的方法指定 容器关闭的时候 调用
●Ioc Annotation
·@Autowired 用的不多
自动寻找对应类型的bean注入到该成员变量中
@Qualifier(value="beanName") 写于方法的参数前 指定被注入bean的name
·@Required 用的不多
这个标签标注的属性必须在配置注入
·@Resource(name="beanName") 常用
写于set方法前 将name对应的bean的对象注入到这个成员变量中
·@Component
<context:component-scan base-package="com.bjsxt"/>
此时xml中的bean都不写了,自动去com.bjsxt这个包中找。
然后用@Component(value="userDAO")注释每个bean类
value指明这个bean的name
·@Scope("prototype")
写于类前,说明此bean的适用范围
·@PostConstruct @PreDestroy
写于方法前,标明此方法在构造完成之后或容器销毁之前调用方法
●AOP
·Aspect-Oriented-Programming 面向切面编程
·使用Spring的AOP 先加入jar包 在spring/lib/aspectj下
在XML中加入
·想要生成没有实现接口的类的代理需要引入spring/lib/cglib/包
·Annocation
1)必须用@Component标注类或者为它配<bean>让Spring管理它
2)用@Aspect标注类为切面逻辑类
3)切入点表达式
任意公共方法执行 execution(public * * (..))
任何以set开始的方法执行 execution(* set*(..))
AccountService接口定义的任意方法的执行 execution(* com.xyz.service.AccountService.*(..))
在service包中定义的任意方法执行 execution(* com.xyz.service.*.*(..))
4)声明通知
@Before 注解一个方法为某(表达式表达的)方法的前置方法
@AfterReturning 注解一个方法为某方法正常结束后的后置方法
@AfterThrowing 注解一个方法为某方法 抛出异常后执行的方法
@After 注解一个方法为某方法无论是否正常结束的后置方法
@Around 注解一个方法为某方法前后都执行 详细参考说明文档6.2.4.5
5)@Pointcut("execution(public * com.bjsxt.dao..*.*(..))")
public void myMethod(){}//定义了一个切入点表达式 名字为myMethod
@AfterRturning("myMethod") //使用上面定义的切入点表达式
public void afterReturn(){
xxxxxxx
}
·XML
1)为切面类写bean让spring管理它
2)声明表达式并命名
用标签experession写明表达式和用id写明切面逻辑的名字 也可以放到aop:aspect中则仅当前aspect可用
3)声明切面
ref写明切面类 aop:before写明此类中的方法名和参考的表达式名 pointcut可以直接定义
<aop:config>
<aop:aspect id="logAspect" ref="logInterceptor">
<aop:before method="before" pointcut-ref="servicePointcut"/>
<aop:before method="before" pointcut="execution(public * com.bjsxt.dao..*.*(..))"/>
</aop:aspect>
</aop:config>
●Spring 整合 Hibernate
·Spring指定datasource
datasource是一个抽象的数据源 因为 数据源的种类很多 比如数据库
1)xml中写明数据源的bean
在类中写好成员变量和getset方法标注@Resource 让spring注入 然后就可以使用此DataSource了
加入jar包 spring/lib/jakarta-commons/commons-dbcp.jar和commons-pool.jar和mySQL的jdbc驱动包
注意 做实验时建立好数据库和表再用spring对表进行操作
2)xml中写明数据源的bean 参数用占位符代替 需要时去properties文件中找
在src目录下建立jdbc.properties内容为
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root
·Spring 整合 hibernate
1)xml中
解释:
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean为spring中支持hibernate的注解的类,在说明文档中没写。
dataSource参数 为hibernate设置数据库 ref参考了数据源的bean
annotatedClasses告诉hibernate哪些类是实体类(在类中用hibernate的注解@Entity标注)
也可以用<property name="packagesToScan">
<list>
<value>com.bjsxt.model</value>
</list>
</property>
此时包内所有实体类会自动被扫描出
hibernateProperties用来设置一些hibernate的参数(以前写在hibernate.propertites文件中的)
2)初始化过程中 由spring将datasource注给sessionfactory,将sessionfactory注给dao,将dao注给service。
调用过程中 service的add调用dao的add,dao的add调用sessionfactory的save.
3)由于在dao中使用sessionFactory是hibernate的东西所以要将hibernate的包都引入,参考hibernate笔记
·声明式的事物管理
1)事物的管理应该加在service层
2)用spring的annotation给方法加事物 将sessionfactory注给事物管理类的bean
还要加入
加入jar包spring/lib/cglib/cglib.jar
3)使用@Transactional(propagation=Propagation.REQUIRED)
注释的方法 会自动加上关于事物的业务逻辑遇到异常会自动回滚
REQUIRED表示,如果调用此方法的方法有事物则此方法调用是事物的一部分,如果没有则创建新事物
使用XML
·HibernateTemplate、HibernateCallback、HibernateDAOSupport介绍
1)设计模式:Template Method 模板模式
callback:回调、钩子 就是在方法内部将自己的参数传给另一个函数让他实现,然后接着执行。
2)HibernateTemplate封装了sessionFactory,取好了session。可以直接使用这个对象的save方法。
首先在XML中生成HibernateTemplate类的bean并将sessionFactory注入
再将HibernateTemplate注入给dao类,dao类就可以用HibernateTemplate的类了。
●Spring 管理 struts2 其实是将spring作为插件 插入到struts2中
·在web.xml中加入监听器 使spring知道项目启动了,然后初始化所有的bean (<web-app>标签内)
下面的配置可以更改配置文件的位置及名字 (<web-app>标签内)
·加入jar包
/struts/struts2-spring-plugin.jar
·原理简析
在struts的action初始化的时候有自己的容器 初始化自己的bean,加入这个包后,
struts在调用自己的容器初始化bean时调用spring初始化bean,spring不仅把action注入到struts中,还把beans.xml中的文件全部注入好。
就是 根据action的名字,去容器中(此时是去spring容器中)找这个名字的bean,将它初始化。
·在action类写好@Component@Scope("prototype")和@Rescourse 由spring生成bean,然后再在struts.xml中的action的class写这个bean的名字而不写类
之后它会去spring中找要注入到action中的bean。
·web.xml中配filter解决session范围问题,因为session关闭后jsp就取不了东西了。
注意:使用这个filter必须在spring中配好声明事物管理Transactiona,否则这个filter认为此事物只读,不允许做增删改。
此filter必须配置在struts2的filter之前
·spring对于乱码的filter
spring2.5
最新推荐文章于 2022-03-05 12:03:23 发布