spring家族常用注解

类解耦

  1. 通过反射来创建对象,避免通过new关键字

  2. 读取配置文件来获取要创建的对象的全限定类名(唯一标志)

结构

  1. 持久层

    • 持久层接口

    • 持久层实现

  2. 业务层

    • 业务层接口

    • 业务层实现

持久层调用jdbc,业务层调用持久层,表现层调用业务层,会存在类相互依赖的情况,需要解耦

编译期依赖:没有某个类,不能正常编译

实际开发应做到,编译期不依赖,运行时依赖

spring的IOC容器是Map结构,一个id对应一个object

spring boot

参考笔记

注解

 

 

 

注解只有一个属性,且属性名是value,则value可以不写

springboot

  1. @SpringBootApplication:Spring Boot Application的入口点是包含@SpringBootApplication注释的类。@SpringBootApplication批注添加到类中,则无需添加@EnableAutoConfiguration@ComponentScan@SpringBootConfiguration

spring

@Autowired

作用:自动按照类型注入,只要容器中有唯一的bean对象类型和要注入的变量类型匹配,就可以注入成功,在ioc容器中不考虑id,直接查找object的类名

出现位置:可以在变量上,也可以在方法上,

匹配过程:先寻找类名一致的,在类名一致的前提下,查看bean的id是否有和要注入变量的名字一样的,若有,则注入,否则报错。

@Bean

作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中,默认是单例的,

属性:

  • name:用于指定bean的id,默认值当前方法的名称

 @Bean
 @Scope('prototype')
 private xxxx xxxx() {}

 

@Component

在持久层、业务层和控制层中,分别采用@Repository(持久层)、@Service(业务层)和@Controller(表现层)对分层中的类进行命名,而用@Component对那些比较中立的类进行命名。

作用:将当前类存放到spring容器中

属性:

  • value: 用于指定bean的id,默认类名(首字母变小写)

 // 以下3中情况都相同
 @Component(value='xxx')
 ​
 @Component('xxx')
 ​
 @Component
 public class Xxx {}

@ComponentScan

作用:用于通过注解指定spring在创建容器时要扫描的包

属性:

  • value:等同于basePackages

  • basePackages:等同于value

 @Component(value="xxx.xxx")
 @Component("xxx.xxx")

@Configuration

作用:指定当前类是一个配置类

@Import

作用:允许从另一个配置类中加载 @Bean 定义

 @Configuration
 @Import(ConfigA.class)

 

@PostConstruct

作用:初始化执行方法,用于@Component之类的方法上

@PreDestroy

作用:销毁方法,多例spring不负责销毁方法,只有单例负责,用于@Component之类的方法上

@PropertySource

作用:用于指定properties文件的位置

 @PropertySource("classpath:jdbc.properties")

 

属性:

  • value:指定文件的名称和路径

@Qualifier

作用:按照类型注入的基础上再按照名称注入,给类成员注入时不能单独使用,但是在给方法参数注入时可以。

属性:

  • value:用于指定bean的id

@Scope

作用:用于指定bean的作用范围

属性:

  • value:常用取值:singleton(单例) | prototype(多例) (默认单例)

@Value

作用:用于注入基本类型和String类型的数据

属性:

  • value:用于指定数据的值,也可以使用spring的el表达式

spring mvc

@RequestMapping

  1. value

  2. method

  3. consumes

  4. produces

  5. params

  6. headers

 @RequestMapping("/test") // test 即为value值
 @RequestMapping(value="/test/{id}", method=RequestMethon.GTET) // 处理动态URI
 String getDynamicUriValue(@PathVariable String id) { // id值可以在这个得到
     System.out.println("ID is " + id);
     return "Dynamic URI parameter fetched";
  }
 ​
 @RequestMapping(method = RequestMethod.POST) // 处理所有post请求
 @RequestMapping()  // 处理所有请求
 String default() {}
 ​
 @RestController
 @RequestMapping("/home") //单个属性可以省略value
 public class IndexController { 
     @RequestMapping(value = "/prod", produces = {
         "application/JSON"
     }) // 返回消息是json类型
     @ResponseBody
     String getProduces() {
         return "Produces attribute";
     }
 ​
     @RequestMapping(value = "/cons", consumes = {
         "application/JSON",
         "application/XML"
     }) // 接受消息是json和xml类型,{} 指定多个消息头
     String getConsumes() {
         return "Consumes attribute";
     }
 }

@RequestParam

作用: 处理?key=value1&key2=value2

 @RequestMapping("/user")
 public String getUserBlog(@RequestParam("id") int blogId) {
         return "blogId = " + blogId;
 }
 ​
 @RequestParam Map<String,Object> params
 // 这样当我们访问/user?id=123时,Spring MVC帮助我们将Request参数id的值绑定到了处理函数的参数blogId上。这样就能够轻松获取用户输入,并根据它的值进行计算并返回了。

相信大家可能注意到了,@RequestParam@PathVariable都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。要访问一篇博客文章,这两种URL设计都是可以的:

  • 通过@PathVariable,例如/blogs/1

  • 通过@RequestParam,例如blogs?blogId=1

那么究竟应该选择哪一种呢?建议:

  1. 当URL指向的是某一具体业务资源(或者资源列表),例如博客,用户时,使用@PathVariable

  2. 当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam

例如我们会这样设计URL:

  • /blogs/{blogId}

  • /blogs?state=publish而不是/blogs/state/publish来表示处于发布状态的博客文章

更多用法

一旦我们在方法中定义了@RequestParam变量,如果访问的URL中不带有相应的参数,就会抛出异常——这是显然的,Spring尝试帮我们进行绑定,然而没有成功。但有的时候,参数确实不一定永远都存在,这是我们可以通过定义required属性:

 @RequestParam(name="id",required=false) // 默认是true,也就是必须传这个参数
 // 当然,在参数不存在的情况下,可能希望变量有一个默认值:
 @RequestParam(name="id",required=false,defaultValue="0")

 

@RequestBody

如果把 json 作为参数传递,我们可以使用 @requestbody 接收参数,将数据转换 Map

@PathVariable

是用来获得请求url中的动态参数的

 

@RequestHeader

@CookieValue

@ModelAttribute

@SessionAttribute

绑定

get

前台传的参数要和后台@RequestMapping绑定方法的参数名一致, 也可以将所有参数封装到一个对象account中,如果有嵌套user,前台的name要使用user.xxx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章