zoukankan      html  css  js  c++  java
  • Spring注解开发-原始注解

    1.Spring原始注解

    Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

    任何一套框架,现在都是两套配置,一套是xml配置,一套是注解配置

    Spring原始注解主要是替代<Bean>的配置

     (1)之前用xml配置的方式

     dao层:

    UserDao

    package com.company.dao;
    
    public interface UserDao {
        public void save();
    }
    

    UserDaoImpl

    package com.company.dao.impl;
    
    import com.company.dao.UserDao;
    
    public class UserDaoImpl implements UserDao {
        public void save() {
            System.out.println("save running...");
        }
    
    }
    

      Service层:

    UserService

    package com.company.service;
    
    public interface UserService {
        public void save();
    }
    

    UserServiceImpl

    package com.company.service.impl;
    
    import com.company.dao.UserDao;
    import com.company.service.UserService;
    
    public class UserServiceImpl implements UserService {
        private UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void save(){
            userDao.save();
        }
    }
    

      Controller层(web层)

    package com.company.web;
    
    import com.company.service.UserService;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class UserController {
        public static void main(String[] args) {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = applicationContext.getBean(UserService.class);
            userService.save();
        }
    }
    

      applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation=
                   "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userDao" class="com.company.dao.impl.UserDaoImpl"></bean>
        <bean id="userService" class="com.company.service.impl.UserServiceImpl">
            <property name="userDao" ref="userDao"></property>
        </bean>
    </beans>
    

      运行结果:

     (2)现在通过注解的方式(原始注解):

    使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法

    UserDaoImpl中:

    UserServiceImpl中:

    (3)使用@Controller,@Service,@Repository替代@Component

     我们看到@Component时,不能意识到它属于哪一层, 使用@Controller,@Service,@Repository语义可以更加明确知道属于哪一层,它们三个的使用方式和@Component一样的

     注意:如果使用xml配置的方式set方法需要写的,如果使用注解的方式,set方法可以不写

     @Qualifier("userDao")去掉仍然可以,直接单独使用@Autowired就可以了,为什么呢?

    因为@Autowired按照数据类型从Spring容器中进行匹配的

    在userDao上面加了一个@Autowired,Spring扫到这个注解之后,会尝试从Spring容器找到UserDao类型的Bean,找到之后,直接给你注到这个地方

    @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的

    <property name="属性名" value=" 属性值"/>  

    通过这种方式来,配置比较繁琐,而且代码比较多。在Spring 2.5 引入了 @Autowired 注释

     如果现在不想按照类型匹配,我想按照名称匹配

     这样可以用@Resource

     (4)注入普通数据类型,用@Value

    运行结果:

    用SpEL(spring表达式)可以获取Spring容器中那个key指定的值,key如果匹配成功,可以将值赋给下面的driver,即${jdbc.driver}

     运行结果:

     (5)@scope产生单例或者多例的Bean

     

     

     (6)使用@PostConstruct和@PreDestroy

    package com.company.service.impl;
    
    import com.company.dao.UserDao;
    import com.company.service.UserService;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    
    // <bean id="userService" class="com.company.service.impl.UserServiceImpl">
    // @Component("userService")
    @Service("userService")
    @Scope("singleton")
    // @Scope("prototype")
    public class UserServiceImpl implements UserService {
        @Value("${jdbc.driver}")
        private String driver;
        @Resource(name="userDao")
        private UserDao userDao;
    
        public void save(){
            System.out.println(driver);
            userDao.save();
        }
    
        @PostConstruct  // 在构造器执行之后(创建对象之后),执行这个初始化方法
        public void init() {
            System.out.println("Service对象初始化方法。。。");
        }
    
        @PreDestroy
        public void destroy() {
            System.out.println("Service对象销毁方法。。。");
        }
    }

     运行结果:

  • 相关阅读:
    C++-类的const成员变量
    Linux-编译器gcc/g++编译步骤
    C++-理解构造函数、析构函数执行顺序
    Linux-Unix版本介绍
    C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
    Linux-如何查看登陆shell的类型
    C++-不要在构造和析构函数中调用虚函数
    C++-模板的声明和实现为何要放在头文件中
    C++-函数模板特化如何避免重复定义
    Linux-Gcc生成和使用静态库和动态库详解
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14116649.html
Copyright © 2011-2022 走看看