1、Spring配置文件中属性值注入时,如果值中含有特殊字符,如<>,那么需要使用cdata包裹进行转义,或者直接使用转义符<,如:
2、Spring配置bean时,如果一个bean的实例化的时候必须依赖与另一个bean的实例,即此bean中用到另外一个bean,此时可以使用depends-on属性进行依赖指定,这样在实例化此bean之前会先实例化依赖bean,如:
3、spring在初始化容器时,默认创建的bean都是单例的,其作用域范围scope属性默认是为singeton,而scope指定为prototype则是多例的,每次获取bean时都会重新创建一个实例,单例形式的bean会在初始化容器时就创建好,而多例形式的bean不会在初始化容器时创建,其会在具体使用时才会真正创建
4、spEL表达式语言,类似与EL表达式语言,spEL采用#{...}作为界定符,支持运行时检查和查询,可以动态赋值bean属性,支持赋值字面量,引用bean属性等,如下:
5、spring注解配置bean
spring注解配置bean先得在xml中配置注解扫描<context:component-scan>,支持@Component,@Service,@Repository,@Controller4者没有明确的分别只是建议不同层使用对应名称,如果不指定value属性,那么以类名的首字母小写为名,也可以指定value属性另起名称,如@Service("xxx"),这样在获取bean时采用getBean(“xxx”)来进行获取
配置了注解扫描scan,那么也就是支持了自动装配功能,因为这两者是一块的,如下:
@Autowired自动装配是依据属性类型并结合名称进行装配,可以加在字段上,也可以加在字段对应的set属性上,先根据属性类型去找对应bean,然后依据属性名称和bean名称来对应,如果bean没有起名字,那么默认就是以类名首字母小写作为名字,一般建议如果名称又冲突的话,可以在@Service("名字")这种bean注解上加上名称以示区分,如果同一个类型有多个实现类,而如果名称又没有区分,那么在装配时就无法对应上具体是哪一个类,这时就会报错,解决报错的方式就是如果类型装配失败了,那么可以通过在bean上指定一个唯一名字,如@Service("AAA"),这时在注入时通过
1、@Autowired MyService AAA 这样也可以对应上名为AAA这个bean,需要注意的是变量名和注解声明的bean名称得一致
2、注入时通过Qualifier指定名称,这样可以与变量名不一致,如果Autowired是加在set属性上,那么Qualifier还可以加在入参的前面,如:
6、Spring是事务,默认是公用一个事务,即主方法中调用了其他很多方法,那么这些方法只要有一个方法出现异常都会导致事务回滚,这是因为其事务传播行为默认为propagation.require,如果调用的这些方法不想和主方法公用一个事务而需要自己的独立事务来管理,那么可以把这个调用的方法的事务传播行为单独设置成propagation.require_new,这样就算后续方法中抛异常,这个独立事务中的方法照样执行成功,适用于一些特殊场合,不过实际开发中使用不多,一般都是在一个事务中进行控制,如果分支方法中出现了特定异常不想让事务回滚,如发短信失败了,订单照样下成功,这时就可以指定事务回滚异常排除的异常类,如@transaction(noRollBackFor={xxxxException.class})
7、springMvc的requestMapping支持3种风格的url
8、SpringMVC天生就是支持RestFull风格的,其有一个类HiddenHttpMethodFilter支持把Post请求转换为delete和Put请求,其会根据请求参数中_method这个参数来判断是哪种方式的请求,需要先在web.xml中配置这个类
HiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter HiddenHttpMethodFilter /*
既然是支持把Post请求转换为Delete和Put请求,那么这两种方式就是和Post请求相关的,的确如此,其是借助Post请求的隐藏域或url参数中添加_method参数,MVC源码中会先根据Post请求这个if判断,进去后再根据_method参数判断是delete还是put,所以先得有post,后才能获取delete和put,
所以delete和put这两种请求也得通过form表单post方式发送,或者借助jquery的post提交,参数中隐藏一个_method就行,如:
RestFull风格请求,也就是让资源和url路径对应,这样就直接从url路径中拿到id,name等信息,不必通过url参数获取,当然这只是一种约束,让url路径更清晰,实在要在url上加?参数也能正常接收到参数,不过一般靠自觉遵守,而如Post提交表单,表单数据一般封装在form中,所以直接从form中获取就行,url路径中可以不用带任何参数,在Controller中通过@pathVariable来进行获取url路径中参数,注意参数名得一致,如
9、如果想在Controller中,每个方法执行之前都向Model域中添加一个对象,那么可以写一个公共的方法,给该方法打上@ModelAttribute注解,那么在每次访问该Controller中任何一个@RequestMapping中都会走此打上@ModelAttribute注解的方法往request域中添加对象,实例方法中的map可以用Model对象替代,原理是一样的,这个方法的好处是,当从页面传过来一个User对象,由于页面传过来的只是部分属性的User,并不全,此时去操作数据库需要补全属性,而这种不全操作可能很多方法中都会用到,那么这种重复方法Springmvc就帮我们做了,在requestMapping方法调用之前,先从数据库查出数据存入Model中,键为user,此键值为传入对象类型User首字母小写作为键,然后如果页面传过来的对象类型与Model中键名一致,如果requesdtMapping入参前加上了@ModelAttribute("xxx"),那么允许类型名和存入名不一致,只要和入参前修饰的ModelAttribute中value值一致即可,那么就会把数据库中的赋给页面传过来的对象中缺失的属性中,然后把这个改造后的对象传入requestMapping对应的目标方法中,这样就省去了手工补全和修改属性值的步骤了,但是如果Controller类被@SessionAttribute注解修饰的话,且SessionAttribute含义此key,就会到session域中去查找此user键的对象,如果有key但是没有对应值则会抛异常,如果没有则反射创建存入Model中,存入Model的同时,如果类上加了session标注,也会存入到session中,判断session中的值主要是为了提高重用性
10、Springmvc在日期类型参数注入时,必须在pojo上指定日期格式,框架才知道按照什么格式进行转换,不然会报错的,前提是配置文件中开启了注解驱动,默认建议必须写上<mvc:annotation-driven/>,加上此注解开启后,默认支持了很多功能
11、静态资源文件请求直接返回渲染,而不经过Controller映射,需要配置defualt-servlet-handler,同时还得有Annotation-driven配置相结合
12、按类型或按名称进行注入
对应bean的id名称为: