Spring常用注解

Spring常用注解

1 、将普通类加入容器形成Bean的注解

日常主要使用到的定义Bean的注解包括(XML方式配置bean暂不讨论):

@Component、@Repository、@Service、@Controller、@Bean

其中@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。
当一个组件代表数据访问层(Dao)时,你可以给它加上@Repository注解,如下例:

  @Repository
  public class TestDaoImpl implements TestDao {

  public void run(){
    ....
   }
  }

当组件用于业务层时,使用@Service注解,如下例:

  @Service(value="TestService")
  public class TestServiceImpl implements TestService {
     @Autowired
     private TestDao testDao;

     public void run(){
       ...
     }
  }

注:

 在此处的@Service注解中额外添加了value=”TestService”的属性,为何对此一举呢?
 value属性可以指定生成后Bean的名称,这个名称便成为容器中bean 的唯一标识符。
 同样的,在@Component、@Repository、@Controller也均可以指定其value值,当然,
 是如有必要时加。

 当组件属于控制层时,则使用@Controller注解;当组件不能进行很好地归类时,那我们可以
 使用@Component注解。
@Bean注解和@Configuration注解事例
    /**
     * 配置普通java类 bean方法
     */
    @Configuration
    @Component
    public class SpringBeansConfig {

        @Bean
        public SnowFlakeLh snowFlake() {
            return new SnowFlakeLh();
        }
    }

@Configuration实际上,常与@Bean注解一起使用的。如果将一个类标注为@Configuration注解,那么也就意味着这个class将会作为创建各种bean的工厂(类似于一个新的容器)。
Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,spring注入直接托管给spring管理,类似接口,使用该方法时直接使用@Autowired注入。
以上的代码实际上等价于Xml中的配置:

    <beans>
     <bean class="com.acme.services.SnowFlakeLh" id="snowFlake"></bean>
    </beans>

注:

在Spring的@Component注解中使用@Bean与在Spring中的@Configuration使用是一定的差别
的。在使用@Component的类中不会强制使用CGLIB代理拦截方法和属性。而在@Configuration
类中,则会使用CGLIB代理去调用@Bean标注的方法并返回对象的引用。在@Configuration注
解中使用@Bean也可以防止同一个@Bean方法被意外调用多次时而产生细微的难以排查的错误
2 、从容器中取Bean(装配bean)时常用的注解

最常用到的用于装配的注解是:@Autowired和@Resourc

  1. @Autowired注解

    @Service
    public class UserServiceImpl implements UserService{
    
       @Autowired
       private TBUserMapper userMapper;
    }
    

    @Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。另外一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称

  2. @Resource注解
    默认情况下按照bean的名称进行注入,当找不到匹配项时会按照类型装配。当按照名称进行装配时,可以指定其name属性,倘若没有指定,注解标注在哪个字段上,其默认名称就是那个字段的名称。当然,@Resource注解也支持按指定类型进行装配,给它的type属性赋特定类型的值即可(注意,当指定了name属性后,只能按照名称装配)

    public class SpringAnotationDemo {
    
    @Resource(name = "httpApiClient")
    private HttpApiClient httpApiClient;
    @Resource(type = XQSmsHttpClient.class)
    private SmsHttpClient smsHttpClient;
    }
    
3、spring MVC模块注解

常用到的注解包括:

@Controller、@RequestMapping、@RequestParam、@PathVariable
  1. @Controller
    将一个类加上@Controller注解后,表明该类会作为与前端作交互的控制层组件
     @Controller
     public class CompanyController {
     ...
     }
    
  2. @RequestMapping
    这个注解用于将url映射到整个处理类或者特定的处理请求的方法

     @Controller
     @RequestMapping("/company")
     public class CompanyController {
    
      @Autowired
      private CompanyService companyService;
     ...
     }
    

    当标注在class上时,表明此类会接收url为”/company”请求

  3. @RequestParam
    用于绑定request请求参数到指定的方法

     @Controller
     @RequestMapping("/company")
     public class CompanyController {
    
      @Autowired
      private CompanyService companyService;
    
      @RequestMapping("/companyList")
      public String listCompanies(Map<string, object=""> map,
         @RequestParam(value = "data", required = false) String data,
         @RequestParam(value = "phone_num", required = true) String phoneNum) {
      map.put("data", data);
      map.put("phoneNum", phoneNum);
      return "companyList";
      }
     ...
     }
    

    上例中,@RequestParam请求参数指定了传入参数的具体字段名(value指定的),以及是否必须传的字段(默认情况下,required=true)。data,phoneNum为形参,即请求参数的使用名,可以更改

  4. @PathVariable
    该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)

     @Controller
     @RequestMapping("/company")
     public class CompanyController {
    
      @Autowired
      private CompanyService companyService;
    
      @RequestMapping("{companyName}")
      public String getCompany(Map<string, object=""> map,
        @PathVariable String companyName) {
      Company company = companyService.findByName(companyName);
      map.put("company", company);
      return "company";
      }
     ...
     }
    

    当我们请求 “/compony/account”时,componyName会动态地绑定为”account”

4、事务模块注解@Transactional

在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作,可用到@Transactional注解
如:

    @Service
    public class CompanyServiceImpl implements CompanyService {
     @Autowired
     private CompanyDAO companyDAO;

     @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
     public int deleteByName(String name) {

     int result = companyDAO.deleteByName(name);
     return company;
     }
     ...
    }

上例表明,执行deleteByName方法时,启用了事务处理,事务的各属性含义如下:

  1. propagation
    事务的传播行为,spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时如何进行传播:
事务传播行为类型 描述
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作
注:第一种是最常用的,默认的
  1. readOnly
    事务的读写属性,取true或者false,true为只读、默认为false rollbackFor
    回滚策略,当遇到指定异常时回滚。
    譬如上例遇到异常就回滚 timeout (补充的)
    设置超时时间,单位为秒 isolation
    设置事务隔离级别,枚举类型,一共五种
类型 描述
DEFAULT 采用数据库默认隔离级别
READ_UNCOMMITTED 读未提交的数据(会出现脏读取)
READ_COMMITTED 读已提交的数据(会出现幻读,即前后两次读的不一样)
REPEATABLE_READ 可重复读,会出现幻读
SERIALIZABLE 串行化(对资源消耗较大,一般不使用)
5、Spring AOP模块注解

spring aop模块的注解主要有@Aspect、@Pointcut、@Before、@Around、@After、
@AfterReturning、@AfterThrowing

  1. @Aspect
    标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器

  2. @Pointcut
    定义切入点,关于切入点表达式书写方式,请移步官方文档:spring AOP文档

  3. @Around
    定义环绕通知,在目标方法执行前后嵌入相关业务逻辑

  4. @Before
    定义前置通知,在目标方法执行前执行

  5. @After
    定义后置通知,在目标方法执行后执行,不论是目标方法执行正常后退出,还是抛出异常后退出,均会被执行

  6. @AfterReturning
    目标方法执行正常退出后执行 @AfterThrowing
    目标方法执行抛出异常后执行

6、@Transient注解

transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

  • 用法:
    @transient 就是在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,用一下。不修改已经存在数据库的数据的数据结构。

  • transient使用小结:
    1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
    2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
    3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

总结

以上是Spring常用注解的全部内容,记录下来方便以后查看学习.

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Spring常用注解
    1. 1.0.0.0.1. 1 、将普通类加入容器形成Bean的注解
      1. 1.0.0.0.1.1. @Bean注解和@Configuration注解事例
    2. 1.0.0.0.2. 2 、从容器中取Bean(装配bean)时常用的注解
    3. 1.0.0.0.3. 3、spring MVC模块注解
    4. 1.0.0.0.4. 4、事务模块注解@Transactional
    5. 1.0.0.0.5. 5、Spring AOP模块注解
    6. 1.0.0.0.6. 6、@Transient注解
  • 1.0.1. 总结
  • 本站总访问量: , 本页阅读量: