spring是一个bean容器,将bean创建的细节在配置文件中配置,应用程序通过bean的ID获得对象
单词:
关于配置的:
scope --配置是否是单例 prototype --多例 singleton --单例
destroy-method ---销毁时执行的方法 property ---调用set方法赋值 constructor-arg ---构造方法赋值
joinpoint 连接点
控制反转IOC
所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护由外部容器来负责。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
依赖注入DI
(把依赖的对象注入到对象里)
所谓依赖注入就是指:在运行期间,有外部容器动态地将依赖对象注入到组件中(构造方法和set方法)
好处:
1.降低组件之间的耦合度,实现软件各层之间的解耦.
2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播
3.容器提供单例模式支持,开发人员不需要自己编写实现代码.
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
spring创建对象的方法
new ---seter方法
--bean的class是创建对象的全限定名
--用property子标签为属性赋值,property的name属性是setter方法去掉set之后的部分,首字母大小写不敏感
--如果该属性是简单类型,则用value指定属性的值
new --有参构造方法
--bean的class是创建对象的完全限定名
用constructor-arg 子标签为属性赋值,他的name属性是构造器的参数名称 也可以用index 也可以用type
静态工厂
bean的class是工厂的完全限定名
factory-method 指定工厂方法名字 例如 getTeacher
工厂方法
--bean的class是创建对象的全限定名(可以不指定)
factory-bean 指定工厂对象,(bean的ID),工厂类对象另外需要一个bean定义
factory-method 指定工厂方法名字 例如 getTeacher
单例
同静态工厂
bean的创建细节:
<bean的属性设置>---此单例非单例模式的单例
spring缺省的bean是单例的 单例bean默认是容器被加载时被创建的 属性 lizy-init="true"---使用时在创建(对多例无作用)
scope 属性设置bean是(单例singleton/多例prototype) 多例bean是使用时在创建
init-method --初始化的方法 bean 被创建时调用 在构造方法/setter 方法/ factory-method 之后执行
destroy-methed -bean被销毁时调用
---销毁时机
单例:spring 容器关闭时销毁,多例:spring不管理(超出作用域销毁)
bean注解:
<context:component-scan base-package="cn.gacl.java"/>
类的注解:
@Component(“a”)---如果没有起名字,则id是首字母小写的类名 是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。 (相当于<bean>***</bean>)
@Controller 通常对应表现层的Bean,也就是Action 等同于@component
@Service 通常对应的是业务层Bean 等同于@component
@Repository 通常对应数据访问层Bean 等同于@component
属性的注解:
注解是通过反射未属性赋值 所以不需要get set 方法
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作 是spring的注解
@Resource(name="") 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面@Resource 默认按 byName 自动注入罢了 是 Javax 的注解
aop切面编程
切面 共同方法抽取的类
通知 切面类的方法
切入点 把通知加入到目标类的位置
织入 把通知加入到切入点
------
1.编写一个切面类,包括一些提取出的执行方法 方法的参数 JoinPoint a --切入方法的签名(每个通知都可以有这个参数)
2.配置文件配置
<aop:config>
<aop:pointcut expression=" execution (* com.bawei.dao.*.*(..))" id="t"/>
<aop:aspect ref="aop" >
<aop:before method="befor" pointcut-ref="t" /> //之前执行的方法
<aop:after-returning method="after" pointcut-ref="t" returning="a"/> //之后执行的方法 returning 可以设置执行目标方法后返回值 值是别名 在切面类方法的参数名字 类型是实际返回的类型
</aop:aspect>
</aop:config>
环绕类型的 aop方法 Object methedName(ProceedingJionPoint name,.....) -(必须是这种格式) 方法体中 用name.proceed();//调用目标方法
注解方法:
1.编写一个切面类,包括一些提取出的执行方法
2.class 加注解 @Component ---相当于<bean> @Aspect --相当于<aop:config >
方法(也可以在类属性定义 private final String POINTCUT = "execution (* com.bawei.jdbcdemo.service.*.*(..))";)
@Before(value = "execution (* com.bawei.jdbcdemo.service.*.*(..))") || @Before(value = POINTCUT)
// 后置,参数是从目标方法中返回的值,需要在配置文件中设置returning
@AfterReturning(value = POINTCUT, returning = "ret")
// 最终
@After(POINTCUT)
// 异常
@AfterThrowing(value = POINTCUT, throwing = "e")
// 环绕
@Around(POINTCUT)
------如果需要赋值 则用 value = POINTCUT, returning = "ret" 形式
ssh整合配置
一、xml 方式
1.导入jar backage ,建立包 类 (dao 类可以继承 hibernateDaoSupper)
2.建立 struts applicationContext.xml 配置文件
3.0 struts 配置文件常量
struts 配置文件常量
//开发模式
<constant value="true" name="struts.devMode"/>
//简单主题
<constant value="simple" name="struts.ui.theme"/>
//action 的实例由 spring 提供
<constant value="spring" name="struts.objectFactory"/>
//拦截所有的 .do 结尾的访问到action
<constant value="do" name="struts.action.extension"/>
3.1 applicationContext.xml 配置
************首先配置sessionFactory**********
<bean destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
<property value="com.mysql.jdbc.Driver" name="driverClassName"/>
<property value="jdbc:mysql:///ssh" name="url"/>
<property value="root" name="username"/>
<property value="pass" name="password"/>
</bean>
<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" id="sessionFactory">
<property name="dataSource" ref="dataSource"/>
<!-- 配置映射文件的三种方式: 1.使用mappingResources 要求列出所有的映射文件 2.使用mappingLocations 使用*通配符指定多个映射文件,注意前面有classpath: 3.使用mappingDirectoryLocations 指定映射目录即可,注意前面有classpath: 第二种和第三种常用 -->
<!-- <property name="mappingResources"> <list> <value>com/bawei/sshxml/bean/Student.hbm.xml</value> </list> </property> -->
<!-- <property name="mappingLocations"> <list> <value>classpath:com/bawei/sshxml/bean/*.hbm.xml</value> </list> </property> -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/bawei/sshxml/bean/</value>
</list>
</property>
<property name="hibernateProperties">
<value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true </value>
</property>
</bean>
********************配置事务*****************
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="transactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- read-only : 为true时只读事务,为false时是读写事务,默认为false。只读事务比读写事务效率高。对于查询操作,使用只读事务。 isolation : 事务的隔离级别,默认为REPEATABLE_READ propagation : 事务的传播属性,默认为REQUERED,如果一个查询操作不需要事务,则可以使用SUPPORTS timeout : 事务的超时,当设置的超时时间到时,如果事务还没有结束,则回滚并关闭。默认为-1,就是永不超时。 默认情况下产生异常就回滚 rollback-for : 指定产生回滚的异常类型 no-rollback-for:指定不回滚的异常类型 rollback-for和no-rollback-for可以同时指定 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" no-rollback-for="ArithmeticException"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="studentServiceOperation" expression="execution(* com.bawei.sshxml.service.impl.*.*(..))"/>
<aop:advisor pointcut-ref="studentServiceOperation" advice-ref="txAdvice"/>
</aop:config>
*******************配置<bean>
3.web.xml 配置监听器 用于加载 spring 容器
context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4.struts2-spring-plugin-x.x.x.jar 保证了action的实例由 spring 提供
-----------------
二、注解方式
1.导入jar backage ,建立包 类 (dao 类可以继承 hibernateDaoSupper)
2.建立 struts applicationContext.xml 配置文件
3.0 struts 配置文件常量
******同 xml 配节方式
3.1 applicationContext.xml 配置文件
<context:component-scan base-package="com.bawei.ssh"/>//配置自动扫描bean
************配置sessionFactory 同上
配置事务
<tx:annotation-driven transaction-manager="transactionManager"
得到事务管理器
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="transactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
--------类里的配置
<bean> 同bean 注解