• Spring注解开发


    简介: Spring注解开发

    1. Spring原始注解

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

    在这里插入图片描述

    • 注意:

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

    <!--注解的组件扫描-->
    <context:component-scan base-package="com.xdr630"></context:component-scan>

    2. xml 方式配置实现

    userDao

    public interface UserDao {
        public void save();
    }

    userDaoImpl

    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
            System.out.println("save running...");
        }
    }

    userService

    public interface UserService {
        public void save();
    }

    userServiceImpl

    public class UserServiceImpl implements UserService {
    
        private UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void save() {
            userDao.save();
        }
    }

    applicationContext.xml

    <bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
    
    <bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>

    UserController

    public class UserController {
        public static void main(String[] args) {
            ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = app.getBean(UserService.class);
            userService.save();
        }
    }

    在这里插入图片描述

    3. 注解配置方式实现

    • 在 UserDaoImpl 下的注解,@Component("userDao") 来替代 下面 bean 的配置
    <bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
    @Component("userDao")

    在这里插入图片描述

    • userServiceImpl 下
    <bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>

    在这里插入图片描述

    • 在 applicationContext.xml 下配置组件要扫描的包
    <context:component-scan base-package="com.xdr630"></context:component-scan>
    • 测试:

    在这里插入图片描述
    在这里插入图片描述

    • xml配置和注解配置达到相同的效果
    • 使用 @Component 注解不能马上意识到是哪一层,所以Spring衍生了三个注解:@Repository、@Service、@Controller ,效果和@Component效果是一样的,可读性好点。

    在这里插入图片描述
    在这里插入图片描述

    • 注意:使用注解方式时,可以省略 set 方法。如:把 userServiceImpl 中的 set 方法删掉,也能成功运行:

    在这里插入图片描述

    • 因为把注解放在属性上,直接通过反射为属性赋值,下面的方法也可以使用被赋值的属性了

    在这里插入图片描述

    • 但如果使用 xml 配置的时候 set 方法是不能省略的
    • 把上面的 @Qualifier("userDao") 注释掉,也能成功运行,直接写@Autowired也能注入。因为@Autowired 是按照数据类型从Spring容器中进行匹配的,当Spring扫描到这个注解之后,它会直接从Spring容器当中找一个 userDao 类型的 bean,找到之后直接注入。如果容器中 UserDao 类型有多个bean,就不能这样写了 。
    • 按照类型注入,@Autowired
    • 按照名称注入,@Autowired 和 @Qualifier 要一起使用

    在这里插入图片描述

    • @Resources 相当于@Autowired 和 @Qualifier

    在这里插入图片描述

    • @Value 注入普通数据类型,如:把 hello 注入给 driver

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 使用@Value进行字符串的注入

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 使用@Scope标注Bean的范围

    在这里插入图片描述

    • 使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

    在这里插入图片描述
    在这里插入图片描述

    • 这里没打印销毁的方法原因是:因为容器还没有关闭程序就执行完了,所以造成销毁的方法还没打印出来
    • 手动关闭就可以看到销毁的方法打印了

    在这里插入图片描述
    在这里插入图片描述

    4. Spring新注解

    使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

    • 非自定义的Bean的配置:<bean>
    • 加载properties文件的配置:<context:property-placeholder>
    • 组件扫描的配置:<context:component-scan>
    • 引入其他文件:<import>

    在这里插入图片描述

    • 下面是实现下使用注解完全替代 xml 文件配置

    在这里插入图片描述

    • 新建一个核心配置类:SpringConfiguration,相当于总配置
    //标志改类是Spring核心配置类
    @Configuration
    //<context:component-scan base-package="com.xdr630"></context:component-scan>
    @ComponentScan("com.xdr630")
    //<import resource="xxx"/>
    @Import({DataSourceConfiguration.class})
    public class SpringConfiguration {
        
    }
    • @Import({DataSourceConfiguration.class}) 里面的值其实是一个数组,可以加载多个类,如:
    @Import({DataSourceConfiguration.class,xxx.class})
    • 新建数据源配置类:DataSourceConfiguration,相当于分配置
    //<context:property-placeholder location="classpath:jdbc.properties"/>
    @PropertySource("classpath:jdbc.properties")
    public class DataSourceConfiguration {
    
        @Value("${jdbc.driver}")
        private String driver;
    
        @Value("${jdbc.url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${jdbc.password}")
        private String password;
    
        @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存到Spring容器当中
        public DataSource getDataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass(driver);
            dataSource.setJdbcUrl(url);
            dataSource.setUser(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    
    }
    • 测试加载核心配置类创建Spring容器
    public class UserController {
        public static void main(String[] args) {
            //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
            UserService userService = app.getBean(UserService.class);
            userService.save();
        }
    }

    在这里插入图片描述
    在这里插入图片描述

    原文链接
    本文为阿里云原创内容,未经允许不得转载。 

  • 相关阅读:
    iOS基础教程:在建好的项目中加入CoreData[转]
    iOS开发--使用lipo命令制作模拟器与真机通用静态库
    Linux命令之du
    简单了解gzip、bzip2、xz
    Linux命令之rpm
    进入CentOS7紧急模式恢复root密码
    解决Linux用户模板文件被删除后显示不正常问题
    Linux修改用户基本信息(不含密码)
    Linux用户密码文件/etc/shadow相关
    SecureCRT、Xmanager对Linux上传下载文件或文件夹
  • 原文地址:https://www.cnblogs.com/yunqishequ/p/15433350.html
Copyright © 2020-2023  润新知