SSM框架注解总结

Spring中的注解:
     注解含义: 
        用于创建对象的注解: 
                相当于:<bean id="" class=""> 
                     @Component注解:
                         作用:
                             把资源让spring来管理。相当于在xml中配置一个bean,次注解使用在实体bean的头部
                         @Component("accountService")
                         public class AccountServiceImpl implements AccountService {}
                             value = "accountService":相当于配置了bean标签的id属性,我们也可以不写value的值默认bean的id是当前类的类名首字母小写accountServiceImpl,单独配置value时,可以省略value。
                       
                    @Controller @Service @Repository:
                         三个注解都是针对@Component注解的衍生注解,他们的作用及属性都是一模一样的。 
                         相当于: <property name="" ref=""> <property name="" value="">
                         他们只不过是提供了更加明确的语义化。 
                         @Controller:一般用于表现层的注解。 
                         @Service:一般用于业务层的注解。 
                         @Repository:一般用于持久层的注解。 
                         细节:如果注解中有且只有一个属性要赋值时,且名称是value,value在赋值时可以不写。
        用于注入数据的: 
                相当于: <property name="" ref=""> <property name="" value="">
                    @Autowired:
                         作用: 
                            自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象的变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。 
                        示例:
                        @Autowired
                        private AccountDao accountDao;


                    @Qualifier:
                         作用: 
                            在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用,
                            但是给方法参数注入时,可以独立使用。
                         属性: 
                            value:指定bean的id。
                         示例: 
                          @Autowired
                          @Qualifier("accountDao2")指定将accountDao注入实体的变量名
                           private AccountDao accountDao;
                        给方法注入实参:
                           public JdbcTemplate craJdbcTemplate(@Qualifier("dataSource") DataSource dataSource){  }

                   @Resource:
                        作用: 
                             直接按照Bean的id注入。它也只能注入bean类型。 
                        属性: 
                            name:指定bean的id。
                        示例:
                        @Resource(name="accountDao")
                        private AccountDao accountDao;

                    @Value:
                       作用: 
                            注入基本数据类型和String类型数据的 
                            属性: 
                            value:用于指定值    
                        示例1:
                        @Value("zahngsan")
                        private String name; name="zahngsan"
                        示例2:
                        //将配置文件jdbc.properties中的数据注解到
                         @Value("${jdbc.driverClass}")
                         private String driverClass;driverClass="com.mysql.jdbc.Driver"


        用于改变作用范围的:
                相当于:<bean id="" class="" scope="">
                    @Scope: 
                        作用: 
                            指定bean的作用范围。 
                        属性: 
                            value:指定范围的值。 
                        取值:
                            singleton:默认的单例
                            prototype:多例


        新注解说明: 
                    @Configuration:
                        作用: 
                            用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。
                            获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。
                        示例代码: 
                            /**
                             * spring的配置类,相当于applicationContext.xml文件
                             */
                            @Configuration 
                            public class SpringConfiguration {
                            }
                    @ComponentScan:
                        作用: 
                            用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的: 
                            <context:component-scan base-package="cn.itcast"></context:component-scan>
                        属性: 
                            Value(单独使用可省略):用于指定要扫描的包。和标签中的basePackages属性作用一样。 
                        示例代码: 
                            /**
                             * spring的配置类,相当于bean.xml文件
                             */
                            @Configuration
                            @ComponentScan("cn.itcast")
                            public class SpringConfiguration {
                            } 
                    @Bean:
                        作用: 
                            该注解只能写在方法上,将方法的返回值作为一个bean,并且放入spring容器。id就是name的属性的值 
                        属性: 
                            name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
                        示例代码:

   @Bean(name="dataSource")
   public DataSource createDataSource() throws Exception
    {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/heima-26");
        ds.setUser("root");
        ds.setPassword("root");
        return ds;
    }


                    @PropertySource:
                        作用: 
                            用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。 
                        属性: 
                            value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
                        示例代码:
                       

     @PropertySource(value = { "classpath:jdbc.properties" })
     public class JdbcConfig {
         @Value("${jdbc.driver}")
         private String driverClass;
         @Value("${jdbc.url}")
         private String url;
         @Value("${jdbc.username}")
         private String username;
         @Value("${jdbc.password}")
         private String password;
         @Bean(name = "dataSource")
         public DataSource createDataSource() throws Exception {
             ComboPooledDataSource ds = new ComboPooledDataSource();
             ds.setDriverClass(driverClass);
             ds.setJdbcUrl(url);
             ds.setUser(username);
             ds.setPassword(password);
             return ds;
         }
     }


                    @Import:
                        作用: 
                            用于导入其他配置类,在引入其他配置类时,其他类上可以不用再写@Configuration注解。当然,写上也没问题。 
                        属性: 
                            value[]:用于指定其他配置类的字节码。 
                        示例代码:
                           

    @Configuration
    @ComponentScan("cn.itcast")
    @Import(value = { JdbcConfig.class })
    public class SpringConfiguration {
    }
    @Configuration//写不写都行
    @PropertySource(value = { "classpath:jdbc.properties" })
    public class JdbcConfig { }


         Spring整合junit:  
                   @RunWith:
                        作用:
                            替换掉junit的运行器,换成一个可以初始化spring容器的运行器。
                        属性:
                            value:单独配置时,value属性名称可以省略,配置SpringJUnit4ClassRunner.class来代替原来junit的运行器 
                    @ContextConfiguration:
                        作用:
                            加载配置类或者xml配置文件
                        属性:
                            value[]:用来指定xml配置文件的路径
                            class[]: 用来指定配置类      
                    示例:自动的加载配置文件的信息
                        //表示spring整合junit使用spring容器的运行器
                        @RunWith(SpringJUnit4ClassRunner.class)
                        //表示加载xml的配置的文件即可完成配置文件的加载

                        @ContextConfiguration(locations={"classpath:applicationContext.xml"})  

            配置Aop注解:
                @EnableAspectJAutoProxy:
                    声明使用注解方式的AOP配置了:    
                @Configuration:
                    标注此类是一个配置的类相当于applicationContext.xml的加载配置的类:
                @ComponentScan("com.itheima"):
                    标注此类相当于applicationContext.xml的加载配置的类,开启包的全局的扫描的方式:
                        @Configuration//标注此类是一个配置的类
                        @ComponentScan("com.itheima")//扫描的类
                        @EnableAspectJAutoProxy//声明使用注解方式的AOP配置了
                        public class SpringConfiguration {
                        }
                @Aspect: 
                    指定当前类是通知类写在类上:
                        @Aspect//声明这是一个切面类(通知类)里面配置的有具体的通知的方法
                        @Service//将此类放到容器中
                        public class Logger {
                        }
                @Before: 
                    前置通知方法:
                        @Before("execution(* com.itheima.serviceImpl.*.*(..))")
                        public void beforePrintLog() {
                            System.out.println("前置通知执行了");
                        }
                @after-returning: 
                    后置通知方法:
                        @AfterReturning("execution(* com.itheima.serviceImpl.*.*(..))")
                        public void afterReturningPrintLog() {
                            System.out.println("后置通知执行了");
                        }
                @after-throwing: 
                    异常拦截通知方法:
                        @AfterThrowing("execution(* com.itheima.serviceImpl.*.*(..))")
                        public void afterThrowingPrintLog() {
                            System.out.println("异常通知执行了");
                        }
                @after:
                    后通知方法:
                        @AfterReturning("execution(* com.itheima.serviceImpl.*.*(..))")
                        public void afterReturningPrintLog() {
                            System.out.println("后置通知执行了");
                        }
                @PointCut: 
                    抽取切点表达式:
                        @Pointcut("execution(* com.itheima.serviceImpl.*.*(..))")
                        public  void pt1(){
                        }
                @around: 
                    环绕通知方法:
                       

    /**
     * 环绕通知
     * 问题:
     * 当配置完环绕通知之后,没有业务层方法执行(切入点方法执行)
     * 分析:
     * 通过动态代理的代码分析,我们现在的环绕通知没有明确的切入点方法调用
     * 解决:
     * spring框架为我们提供了一个接口,该接口可以作为环绕通知的方法参数来使用
     * ProceedingJoinPoint。当环绕通知执行时,spring框架会为我们注入该接口的实现类。
     * 它有一个方法proceed(),就相当于invoke,执行目标方法
     * <p>
     * spring的环绕通知:
     * 它是spring为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
     */
     @Around("pt1()")
     public Object around(ProceedingJoinPoint pjp) {
         try {
             System.out.println("增强了前置通知!");
             Object obj = pjp.proceed();
             System.out.println("增强了后置通知!");
             return obj;
         } catch (Throwable e) {
             System.out.println("增强了异常通知!");
             throw new RuntimeException(e);
         } finally {
             System.out.println("增强了最终通知!");
         }
     }


                基于注解的事务管理:
                    @Transactional:
                        @Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。
                        注解使用在类上表明此类下的所有的方法是一个基于注解的事务
                        定义在接口上,只有接口的代理的实现的类可认为是基于注解的方法。因为注解不能被继承。
                        然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅是一种元数据,能够被可以识别。要开启注解的植物管理 <tx:annotation-driven/>:

SpringMvc中的注解:
                    @Controller:
                        Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类:

                    @RequestMapping:
                        在类前面定义,则将url和类绑定;(如果该类里只有单个方法的话可以这样写,访问该地址直接调用该方法):
                        示例代码如下:
                            @Controller
                            @RequestMapping("/getUser")
                            public class UserController {
                            ......
                            ......
                            }
                        定义在方法上则会为方法生成一个请求的路径:
                            @RequestMapping("/hello")
                            public String getHello() {
                                return "index";
                            }
                        可以携带请求的参数 Rest风格(占位符)的映射:
                            @RequestMapping(value=“/user/{name}/{id} ")
                            请求URL:http://localhost:8080/user/zhangsan/1001.do
                            这种方式虽然和通配符“*”类似,却比通配符更加强大,占位符除了可以起到通配的作用,最精要的地方是在于它还可以传递参数。
                            测试一:
                            @RequestMapping(value="show4/{name}/{id}")
                              public ModelAndView test4(){
                                ModelAndView mv = new ModelAndView();
                                mv.setViewName("hello");
                                mv.addObject("msg", "占位符的映射:");
                                return mv;
                              }
                          与其相关:
                            @GetMapping:相当于@RequestMapping(method = RequestMethod.GET)
                            @PostMapping:相当于@RequestMapping(method = RequestMethod.POST)
                            @PutMapping:相当于@RequestMapping(method = RequestMethod.PUT)
                            @DeleteMapping:相当于@RequestMapping(method = RequestMethod.DELETE)

                    @PathVariable:
                        与 Rest风格(占位符)的映射一起使用获取参数数据:
                            @RequestMapping(value="/show4/{name}/{id}")
                            public ModelAndView test4(@PathVariable("name")String name,@PathVariable("id")Long id){
                              ModelAndView mv = new ModelAndView();
                              mv.setViewName("hello");
                              mv.addObject("msg", "占位符的映射:"+name+"..."+id);
                              return mv;
                            }
                          @PathVariable(“userId”) Long id, @PathVariable(“name”)String name获取对应的参数:
                          @PathVariable(“key”)中的key必须和对应的占位符中的参数名一致,而方法形参的参数名可任意取:
                    @RequestParam:
                        A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String--> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值:
                        B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST:
                        GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
                        POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。
                        C) 该注解有三个属性: value、required、defaultValue:
                        value用来指定要传入值的id名称:
                        required用来指示参数是否必须绑定:
                        defaultValue用来指定在前端没有传值的情况下限定默认的值:
                            @RequestMapping(value="show19")
                            public String test19(Model model,@RequestParam(value="name")String name){
                              model.addAttribute("msg", "使用@RequestParam接收到的参数为:"+name);
                              return "hello";
                            }
                            @ResponseStatus(value=HttpStatus.OK):如果不响应页面,就需要响应状态:
                            @RequestMapping(value = "show23")
                            @ResponseStatus(value=HttpStatus.OK)//不响应页面,就需要响应个状态码
                            public void test23(@RequestParam("name")String name,
                           @RequestParam("age")Integer age,
                           @RequestParam("isMarry")Boolean isMarry, //可以将on或者1转换为true,0转换为false.
                           @RequestParam("income")Float income,
                            @RequestParam("interests")String[] interests) {
                              StringBuffer sb = new StringBuffer();
                              sb.append("name:"+name+"\n");
                              sb.append("age:"+age+"\n");
                              sb.append("isMarry:"+isMarry+"\n");
                              sb.append("income:"+income+"\n");
                              sb.append("interests:[");
                              for (String inter : interests) {
                                sb.append(inter+" ");
                              }
                              sb.append("]");
                              System.out.println(sb.toString());
                            }


                    @CookieValue使用方法同@RequestParam:获取cookie的值:
                            @RequestMapping(value = "show22")
                            public String test22(Model model, @CookieValue("JSESSIONID")String jsessionid) {
                              model.addAttribute("msg", "jsessionid:" + jsessionid);
                              return "hello";
                            }
                    @ResponseBody:
                            当一个处理请求的方法标记为@ResponseBody时,表示该方法需要输出其他视图(json、xml),springmvc会通过默认的json转化器转化输出,但是需要引入相关的jar包:
                              <!--jackson支持json解析-->
                              <dependency>
                                  <groupId>com.fasterxml.jackson.core</groupId>
                                  <artifactId>jackson-databind</artifactId>
                              </dependency>
                              /**
                               * 将list集合响应成json数据
                               * @return
                               */
                              @RequestMapping(value="show28")
                              @ResponseBody//将数据响应成json格式的数据
                             

public List<User> test28() {
    List<User> list = new ArrayList<User>();
    for(int i = 0;i< 20;i++) {
      User user = new User();
      user.setId(i+1L);
      user.setUsername("zhangsan"+i);
      user.setName("张三"+i);
      user.setAge(18);
      list.add(user);
       }
    return list;
   }


                    @RequestBody:接收一个json并且转换成一个对象
                                /**
                                 * 将提交的json格式的数据封装到user对象中
                                 * 
                                 * @RequestBody():自动将json数据序列化成一个user对象
                                 * @param model
                                 * @param user
                                 * @return
                                 */
                                @RequestMapping(value="show29")
                                public String test29(Model model,@RequestBody()User user) {
                                  model.addAttribute("msg", user);
                                  return "hello";
                                }


                    @RestController:

                                有时如果在一个Contoller中所有的方法都是用来响应json格式数据的,那么如果有多个方法,就需要在多个方法上使用@ResponseBody,这样太麻烦,springmvc提供了一个@RestController,将该注解使用在Controller类上,那么该controller中的所有方法都默认是响应json格式的数据了。

Mybatis框架常用注解总结:
                   @Param:

                           使用@Param注解为相应的查询接口传递值,但是具体SQL语句中的参数要与@Param中定义的参数保持一致。

//mapper接口定义
List<Student> selectBetweenCreatedTimeAnno(@Param("begin")Date beginMonth, @Param("end")String endMonth);

//SQL语句
  <select id="getAssessRecord" resultMap="SmuAssess">
      select * from smu_assess_table3 where occurMonth between #{begin} and #{end} 
  </select>

                 @MapKey:

                           MyBatis使用@MapKey注解接收多个查询记录到Map中.

@MapKey("id")  

public Map<Integer,Map<String,Object>>getUsers(Map<String,Object>param);  


<select id="getUsers" resultType="java.util.Map"  parameterType="java.util.Map">

  select id,name,sex from t_user

 </select> 

返回的结果是 
{1={name:jasion,sex:1},2={name:jack,sex=1}}

谢谢大家阅读学习,如有错误欢迎留言指正ha。

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