1,单例模式:
所有的bean默认的都是单例模式;就是说拿的都是同一个user对象;可以通过测试拿hashcode看是否一致。
2,多例模式;
拿到的不是一个对象。
地址值不同;
注解开发
IOC中能给我使用注解的都用注解?除非是jar包源码中的类加不了注解,那么就用XMl配置
声明注解;
用于替换自建类型组件的《bean》标签,可以更快的声明Bean(所有的默认的id为类名首字母小写)
@Service 业务类专用
@Repository dao实现类专用
@Controller web层专用
@Component通用
@Scope 用户控制bean的创建模式(如单例,多例模式的设置)
注入注解:
@Autowired 基于类型自动注入
@Resource 基于名称的自动注入
@Qualifier(“userDao”) 限定要自动注入的Bean的id,一般和@Autowired 联合使用
@value 注入简单类型数据(jdk8种+string 时间)
事务的相关注解;
@Transactional 一般业务层才有事务
工厂配置中的…和aop:config…可以省略
事务的注解可以加在类上表示每一个方法都被事务管理(但是自己事务控制的除外)
也可以加在单个方法上,表示该事务只对此方法有效
开启注解的扫描:
<!--注解的配置,扫描注解,把加了注解的加到ioc:告知spring注解的位置,这里指出包就行-->
<context:component-scan base-package="com.qf"></context:component-scan>
<!-- 让@Transactional事务注解生效
<tx:annotation-driven transaction-manger="tx"/>-->
<!-- 添加如下配置,启用aop注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
AOP注解开发
@Aspect // 声明此类是一个切面类:会包含切入点(pointcut)和通知(advice)
@Component //声明组件,进入工厂
// 定义切入点
@Pointcut(“execution(* com.qf.spring.service.UserServiceImpl.*(…))”)
所有通知都是通过切点去插入的
@Before(“pc()”) // 前置通知
@AfterReturning(value=“pc()”,returning=“ret”) // 后置通知
@AfterThrowing(value=“pc()”,throwing=“ex”) // 异常通知
@Around(“pc()”) // 环绕通知
测试类的注解;
<dependency>
<!--spring对测试的支持-->
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<!-- 测试-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
//测试启动,就会启动spring工厂,并且点点测试类也会被工厂生产
@RunWith(SpringJUnit4ClassRunner.class)//启动:加载这个类实现调用测试类,他一起动所有的类就有spring接管了
//支持通配符写法
@ContextConfiguration("classpath:application.xml")//指明工厂中的配置位置
public class Test {
//把想测试的类注入进来(在启动时就把所有测试被spring接管了)
@Autowired
// @Qualifier("AccountService2")//测试那个就把那个注入到里面(也可以不写)
AccountService service;
//直接按之前方法测试
@org.junit.Test
public void test() {
service.transfer(2, 1, new BigDecimal("10"));
}
}
1,service注解;id默认为类名首字母小写
@service scope加单例和多例模式
2, 构造方法的注解@aurowirec根据类型自动注入,@resource是根据名称自动注入, 3,当有多个属性时再根据类型去注入哟可能会出现重复而找不到,所有要配合@Qualifier使用:@aurowirec@Qualifier(“userdao”)表示基于类型注入并挑选beanid=“userDao”
4,当是基本数据就@value(“1”)
5,model类的注解@Component(“person”)
生命周期
分单例和多例模式;
**单例bean:**singleton
随工厂启动创建 ==》 构造方法 ==》 set方法(注入值) ==》 init(初始化) ==》 构建完成 ==》随工厂关闭销毁
**多例bean:**prototype
被使用时创建 ==》 构造方法 ==》 set方法(注入值) ==》 init(初始化) ==》 构建完成 ==》JVM垃圾回收销毁
SpringMVC的注解;
@Controller定义是一个servlet
@RequestMapping("/user")
@ModelAttribute //就是访问在该类中所有处理器时,注释的方法会在此controller每个方法执行前被执行
@ResponseBody//就是声明该方法不走视图解释器,走HttpMessageConverter,在一个方法上边加注解,
@RestController//=controller+responsebody
就是该controller下面所有的hander都是前后端分离的接口,返回的数据类型都是和json有关了,
@RequestBody ajax请求发过来的是json,你想用对象来接收就要用@RequestBody,同样是走HttpMessageConverter,得到的是对象。
@RequestMapping:
value : 所有请求地址的公共部分,叫做模块名称
属性: method, 表示请求的方式。
params={“name”,“age”}:表示请求中必须要带的参数。
@RequestParam 作用在形参上,解决请求参数名和形参名不一致的问题
* name:就是将请求参数的值给到标记的形参
* required:想访问这个请求是否必须携带该键值对的请求参数,默认必须携带
* defaultValue:当required=false时,如果不传该请求参数,形参拿到的默认值
跨域: @CrossOrigin(“http://localhost:8080”) //允许此域发请求访问;
在通过8081端口访问js时,在js里面有发了一个ajax的请求去访问8080是可以访问但是因为同源问题,跨域之后所有取不到值,所以在8080的controller加一个@CrossOrigin(“http://localhost:8080”) //允许此域发请求访问,这样就可以在8081里发请求访问这个域。
@PathVariable 可以将restFul请求中的路径参数转换为id(用在rest风格的前后端分离开发时url的拼接)
springMVC的json转换时用的参数控制的注解;
- 日期格式化:@JSONField(format=“yyyy/MM/dd”)
- 属性名修改:@JSONField(name=“birth”)
- 忽略属性:@JSONField(serialize = false)
- 包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 默认会忽略所有null值,有此注解会输出null
@JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为**""** - 自定义序列化:@JSONField(serializeUsing = MySerializer2.class)
springmvc-------------------------------------------------------
@requestMapping
name:限定请求的映射路径,可以为数组,method:限定请求的类型, params:限定请求中必须携带的参数)设置请
求路径
@GetMapping 查询
PostMapping 添加
@DateTimeFormat(pattern=“yyyy-MM-dd HH:mm:ss”)Date birth
针对时间类型
@PathVariable 用来映射URL中的占位符到目标方法的参数
@CookieValue: 会将cookie中键所对应的值赋值给形参
@ModelAttribute注释的方法会在此controller每个方法执行前被执行
@ResponseBody //将handler的返回值,转换成json(jackson),并将json响应给客户端。
@RestController 等于@Controller + @ResponseBody。
@Validated 参数校验 ( BindingResult br这个形参必须紧跟)@Validated的形参后面
Jackson常用注解------------------------
@JsonProperty(“new_name”) 起别名
@JsonInclude(JsonInclude.Include.NON_NULL) 默认会输出null值的属性,如果不需要,可以排除。
@JsonSerialize(using = MySerializer.class) // 使用MySerializer输出某属性
FastJson---------------------------
- 日期格式化:@JSONField(format=“yyyy/MM/dd”)
- 属性名修改:@JSONField(name=“birth”)
- 忽略属性:@JSONField(serialize = false)
- 包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 默认会忽略所有null值,有此注解会输出null
- @JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""
- 自定义序列化:@JSONField(serializeUsing = MySerializer2.class)
@PostMapping 增加
@DeleteMapping 删除
@GetMapping 查询
@PutMapping 修改