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>
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>