spring学习笔记

1、class ServiceBean{
private DaoBean = new DaoBean();//这里DaoBean是在应用内部创建及维护的。
}
控制反转:就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是有外部容器负责的。这样控制权就由应用转移到了外


部容器,控制权的转移就是反转。


2、写xml文件时怎么才能出现提示:
   1、让机器上网,eclipse会自动从网络上下载schema文件并缓存在硬盘上;
   2、详见图片


3、bean中有id和name两个属性,都是给bean定义一个名字;区别:id是xml中的一个属性,xml可以检查它的语法,id中不能有特殊字符


,比如斜杆。name没有这个限制。建议用id


4,bean的三种实例化方式:
  1,使用类构造器实例化(常用),要求有一个无参构造方法;
  2,使用静态工厂实例化;
  3,使用实例工厂方法实例化;


5,bean默认是单例,可以通过scope=prototype|singleton属性指定作用范围,


6,判断一个对象什么时候被实例化,最简单的方法可以在默认的构造函数中打印出一句话。


7,单例的情况下:默认启动spring容器的时候实例化对象;原型的情况下:默认第一次调用的时候才会实例化对象


8,延迟实例化(建议少用):指定属性lazy-init=true|false|default(可以在bean中指定单个,也可以在beans中指定所有)


9,初始化实例(常用于打开资源):指定init-method属性,值为类中的一个方法名。(实例化之后会立即执行的方法);destory-method


属性(实例被销毁之前执行的方法,常用于关闭打开的资源)


10,关闭spring容器:AbstractApplicationContext act = new ClassPathXmlApplicationContext("beans.xml");
                    act.close();//关闭spring容器


11,依赖注入的两种方式:
1、通过构造器参数;
2、通过setter方法注入:通过ref方式(可以为多个bean服务);采用内部bean方式(只能为一个bean服务),如下:
           <bean id="" class="">
             <property name="">
                 <bean class=""/>
             </property>
           </bean>


12,注入基本类型(自动匹配类型):在bean中加一个property属性,如
           <bean id="" class="" >
              <property name="" value="值"/>
           </bean>


13,集合类型的注入:set:在property中加一个set标签,例如private Set<String> sets = new HashSet<Stringg>();
           <bean id="" class="" >
              <property name="属性名称" >
 <set>
                    <value>第一个值</value>
                    <value>第二个值</value>
                  </set>
     </property>
           </bean>
14,list和set一样,只需将set标签换成list标签。


15,property集合: private Properties properties = new Properties();
           <bean id="" class="" >
              <property name="属性名称" >
 <props>
                    <prop key="key1">value1</prop>
                    <prop key="key2">value2</prop>
                  </props>
     </property>
           </bean>
    
16,map集合:
          <bean id="" class="" >
              <property name="属性名称" >
 <map>
                    <entry key="key1" value="value1"  />
                    <entry key="key2" value="value2"  />
                  </map>
     </property>
           </bean>


17,使用构造器注入(不需要setter方法):
         <bean id="" class="" >
              <constructor-arg index="" type="" ref="" value=""/>
         </bean>
   参数解释:index从0开始;
             type:复杂类型写全称,基本类型可以省略;
             ref:当参数是一个对象时(复杂类型),ref是注入的bean名字,value不用写;
             value:当参数是基本类型时,基本类型的值,ref不用写;


18,手工装配:在xml文件中自己写配置文件
19,自动装配:spring2.5之后支持的注解方式,需要打开context命名空间


20,使用注解,首先引入context命名空间,其次打开配置项<context:annotation-config/>,它隐式注册了多个对注解进行解析处理的


处理器:
         AutowireAnnotationBeanPostProcessor-->@Autowired
         CommonAnnotationBeanPostProcessor-->@Resource
         PersistenceAnnotationBeanPostProcessor-->持久化
         RequiredAnnotationBeanPostProcessor-->


21,注解本身是用来配置的,功能和xml一样


22,要想在配置文件中出现提示,就需要.xsd文件。


23,使用注解,需要引入common-annotations.jar文件






25,@Autowired和@Resource(建议使用)作用一样,区别:
@Autowired默认按类型装配,如果允许为null,可以指定属性required="false";同时指定@Qualifier("bean名称")        改


为按名称装配;
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配(如果指定name属性,则只能按名称装配)


26,自动装配:在<bean    autowire="byType|byName|constrtctor|autodetect" />指定autowire属性,不推荐使用


27,使用自动扫描技术(2.5推出):首先引入context命名空间,
   其次打开配置项<context:component-scan base-package="包名" /> ,这个配置项包含了<context:annotation-config />,所以后


者可以省略不写
   @Service:用于标注业务层组件;
   @Controller:用于标注控制层组件,如struts中的action;
   @Repository:用于标注数据访问组件,即DAO组件;
   @Component:泛指组件,当组件不好归类时,可以用这个注解进行标注;
   在2.5中这几个注解功能一样,spring还没有将他们区分。
   默认bean的名称为类名第一个字母小写。可以通过@Component("bean名称")指定bean的名称。
   默认bean为单例。可以通过@Scope("prototype")这样的方式指定作用范围。


28,实例的初始化用@PostConstruct这个注解,只要写在需要初始化的方法上边即可。


29,实例销毁前用@PreDestory这个注解,只要写在需要销毁的方法上边即可。


30,Aspect(切面):切面与类相似,类是对事物特征的抽象;切面是对横切性关注点的抽象。


31,joinpoint(连接点):被拦截的具体方法


32,Pointcut(切入点):指对拦截的方法(哪些切入点)的定义


33,Advice(通知):拦截之后所要做的事情。通知分为前置通知、后置通知、异常通知、最终通知、环绕通知


34,使用aop编程:首先引入aop命名空间,其次引入aop.xsd文件,导入aspectjweaver.jar和aspectjrt.jar和cglib-nodep.jar


35,使用aop注解开发时,首先打开配置项<aop:aspectj-antoproxy/>


36,切面类一定要交给spring容器管理


37,aop在xml中配置时:返回值为String类型,表达式写法expression="execution(java.lang.String cn.cjf..*.*(..))"
    第一个参数为String,后边的不考虑,表达式写法expression="execution(* cn.cjf..*.*(java.lang.String,..))"
    拦截所有非void的方法,表达式写法expression="execution( !void cn.cjf..*.*(..))"


38,spring和jdbc集成时依赖的jar文件有:commons-dbcp.jar和commons-pool.jar
   使用注解,需要引入common-annotations.jar文件


39,采用@Transactional注解方式使用事务:首先需要声明tx命名空间;其次引入.sxd文件;
        然后打开配置项<tx:annotation-driven transaction-manager="txManager"/>


40,在spring的业务类bean前边加上注解@Transaction,之后bean的所有方法都会受spring事务管理:在方法前打开事务,在方法后关闭


事务
@Transactional
public class PersonServiceBean{
public void save(){
           .....
        }
}


41,使用属性文件保存数据库连接信息时,要打开配置项<context:property-placeholder location="classpath:jdbc.properties" />
   其中jdbc.properties为指定的属性文件名称,指定classpath则明确告知在类路径(src)下边;
   则配置文件value=${属性文件中值的名称}


42,spring默认运行期异常(unchecked)事务回滚;Exception(checked)(方法后边需要throws Exception)异常事务不回滚,可以修改
   checked异常可以通过在方法上边加@Transactional(rollbackFor="Exception.class")使事务回滚
   unchecked异常可以通过在方法上边加@Transactional(noRollbackFor="RuntimeException.class")使事务不回滚


43,对于某些只获取数据不修改数据库的方法,可以不开启事务(因为事务会影响性能),可以通过下边声明:
   可以通过在方法上边加@Transactional(propagation="Propagation.NOT_SUPPORTED")声明不开启事务


44,spring默认的事务传播行为是REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已经处在一个事务中,那么加入到该事


务中,否则为自己建一个新事务。@Transactional(propagation="Propagation.REQUIRED")可以省略不写。


45,只使用事务注解的话可以只打开<tx:annotation-driven transaction-manager="txManager"/>;如果需要其他依赖注入注解的话还


需要打开注解配置项<context:annotation-config/>


46,使用ssh集成式,在dao中注入sessionFactory之后,必须使用sessionFactory.getCurrentSession()获取session.因为使用了spring


的事务处理机制已经在方法前打开了一个session.
@Transactional
public class PersonServiceBean{
@Resource
private SessionFactory sessionFactory;
        public void save(Person person){
      sessionFactory.getCurrentSession().save(person);
        }
}


47,hibernate中的persist()和save()相似;merge()方法和update()方法相似。merge()将游离对象同步到数据库,返回一个脱管对象。


48,@Transactional(propagation="Propagation.NOT_SUPPORTED",readOnly=true),一般这两个属性会同时出现。


49,业务层(save()、delete())开发完成后要先进行单元测试。没问题之后可以继续集成控制层(action层)


50,单元测试时,点击要测试的类的接口,一般测试类的接口。单元测试一般要勾选setUpBeforeClass选项:实例被构建出来之后会立刻


执行的一个方法。可以在此方法中做一些初始化的操作,譬如说可以实例化spring容器。


51,web容器对spring自动实例化(可以不用手动实例化):
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
指定spring的配置文件,默认从web根目录开始寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找。
如果配置文件有多个,可以逗号分隔。
<context-param>
<param-name>contextConfigLocation<param-name>
        <param-value>classpath:beans.xml<param-value>
</context-param>


52,spring实例化之后被放到application中,应用开启的时候创建,关闭的时候销毁。


53,spring和struts集成时,struts要想交给spring容器管理,则struts.xml文件中的action名字必须与spring容器中bean名称相同。


54,使用spring解决乱码问题:在web.xml中添加filter


55,使用spring解决hibernate因session关闭导致的延迟加载例外问题:在web.xml中添加filter
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值