spring的单例,注解,生命周期

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值