二Java框架之Spring注解开发

Posted wxygf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二Java框架之Spring注解开发相关的知识,希望对你有一定的参考价值。

文章目录


从Spring2开始引入注解,Spring3已经可以纯注解开发,以避免使用复杂的配置文件

1. IOC/DI注解开发

1.1 Component注解

@Component

  • 在对应类上添加Component注解

  • 在applicationContext.xml指定要扫描的路径

    注意:这里首先创建了context命名空间,然后使用了component-scan base-package,之后就可以正常获取bean了

    • 扫描的范围是 base-package 指定的范围
  • 测试BookService

    //BookServiceImpl.java
    @Component
    //可以不添加名称,之后按类型获取
    
    //applicationContext.xml
    <context:component-scan base-package="org.example"/>
    
    //App.java
    BookService bookService = ctx.getBean(BookService.class);
    bookService.save();
    

@Controller @Service @Repository

这三个注解是Component的衍生注解,作用和Component相同,只是为了区分某个类是属于表现层业务层还是数据层的类

  • Controller注解:表现层,例如BooServlet.java
  • Service注解:业务层,例如BookServiceImpl.java
  • Repository注解:数据层,例如BookDaoImpl.java(代表mybatis里面的mapper部分)

1.2 纯注解开发模式

不再写applicationContext.xml配置文件,而是用Config类替代

  • 创建Config类

    @Configuration//表示这是个配置类,相当于applicationContext.xml默认部分,如命令空间xmlns那一块内容
    @ComponentScan("org.example.dao")//相当于设置了<bean>标签
    public class SpringConfig 
    
    

    之前的applicationContext.xml已经可以删除了

    • @Configuration:设置该类为spring配置类

    • @ComponentScan:设置spring配置类扫描路径,此注解只能添加一次,多个数据用格式,如

      @ComponentScan("org.example.dao", "org.example.service")
      
  • BookDaoImpl.java

    package org.example.dao.impl;
    
    @Repository("bookDao")
    public class BookDaoImpl implements BookDao 
        public void save() 
            System.out.println("book dao save ...");
        
    
    
    
  • 使用SpringConfig:AnnotationConfigApplicationContext

    public class APP 
        public static void main(String[] args) 
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
            BookDao bookDao = (BookDao) ctx.getBean("bookDao");
            System.out.println(bookDao);
            BookService bookService = ctx.getBean(BookService.class);
            System.out.println(bookService);
        
    
    

1.3 注解开发bean管理

@Scope

设置是否为单例模式

@PostConstruct @PreDestroy

管理生命周期 init() 和 destroy()

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
ctx.close();//关闭容器,从而可以看到destroy()的信息

1.4 注解开发依赖注入

@Autowired @Qualifier

如果只有一个实现类implements BookDao时,仅需@Autowired即可自动注入
如果只有多个实现类implements BookDao时,还需@Qualifier(“name”)指定哪一个实现类

使用@Autowired可以省略setter方法

@Value

name变量被注入了值 “example”
这样单纯使用@Value是没有意义的,注解主要是为了加载properties文件,使得变量值可更改

@PropertySource

读取Properties配置文件

  • 新建jdbc.properties

    name=example
    
  • 配置Config类

    package org.example.config;
    
    @Configuration
    @ComponentScan("org.example.dao", "org.example.service")
    @PropertySource("classpath:jdbc.properties")
    public class SpringConfig 
    
    
  • 注入

    package org.example.dao.impl;
    
    @Repository("bookDao")
    public class BookDaoImpl implements BookDao 
        @Value("$name")
        private String name;
        public void save() 
            System.out.println("book dao save ..."+name);
        
    
    

注意事项:(1)多个properties配置文件同样使用格式;(2)不支持通配符

1.5 第三方bean管理

@Bean

  • 导入依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.16</version>
    </dependency>
    
  • 配置Config文件

    @Configuration
    public class SpringConfig 
        //1. 定义一个方法获得要管理的对象
        //2. 添加@Bean,表示当前方法的返回值是一个bean
        @Bean
        public DataSource dataSource()
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
            ds.setUsername("root");
            ds.setPassword("root");
            return ds;
        
    
    
  • 获取Bean并运行

    ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    DataSource dataSource = ctx.getBean(DataSource.class);
    System.out.println(dataSource);
    

@import(多个Config类)

像是上面的dataSource()这类的通常会专门创建一个Config类,如JdbcConfig,现在需要使其生效

方法一(不推荐)

  • JdbcConfig.java

    @Configuration
    public class JdbcConfig 
        @Bean
        public DataSource dataSource()
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
            ds.setUsername("root");
            ds.setPassword("root");
            return ds;
        
    
    
  • 还需要配置SpringConfig.java

    @Configuration
    @ComponentScan("org.example.config")
    public class SpringConfig 
    
    

方法二(推荐)

  • JdbcConfig.java

    public class JdbcConfig //注意,没再使用@Configuration
        @Bean
        public DataSource dataSource()
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
            ds.setUsername("root");
            ds.setPassword("root");
            return ds;
        
    
    
  • 配置SpringConfig.java

    @Configuration
    @Import(JdbcConfig.class)
    public class SpringConfig 
    
    

练习:使用@Value和properties文件修改上述代码

引用类型的注入

  • BookDaoImpl.java

    @Repository
    public class BookDaoImpl implements BookDao 
        public void save() 
            System.out.println("book dao save ...");
        
    
    
  • SpringConfig.java

    @Configuration
    @ComponentScan("org.example.dao")//关联到BookDaoImpl
    @Import(JdbcConfig.class)
    public class SpringConfig 
    
    
  • JdbcConfig.java

    @PropertySource("classpath:jdbc.properties")
    public class JdbcConfig 
        @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
        public DataSource dataSource(BookDao bookDao)
            System.out.println(bookDao);
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(username);
            ds.setPassword(password);
            return ds;
        
    
    
  • 自动装配
    上面仅提供了一个形参bookDao,即可自动注入
    这是因为@Bean使其认为形参应当被自动提供,于是将自动寻找相应的类,并注入到形参中

总结

  • 1.第三方Bean管理
    • @Bean
  • 2.第三方依赖注入
    • 引用类型:方法形参
    • 简单类型:成员变量

1.6 XML配置和注解配置对比

2. Spring整合MyBatis

2.1 mybatis写法回顾

  1. 创建javaweb项目,在pom.xml添加<packaging>war</packaging>

  2. 配置pom.xml依赖和插件

    <dependencies>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <!--Tomcat插件,非必要 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>
    
  3. 编写mybatis-config.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <properties resource="jdbc.properties"/>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库连接信息-->
                    <property name="driver" value="$jdbc.driver"/>
                    <property name="url" value="$jdbc.url"/>
                    <property name="username" value="$jdbc.username"/>
                    <property name="password" value="$jdbc.password"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
        	<package name="org.example.mapper"/>
    	</mappers>
    </configuration>
    

    jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///spring_db?useSSL=false&amp;useServerPrepStmts=true
    jdbc.username=root
    jdbc.password=123456
    
  4. 创建AcccountMapper.xml和AccontMapper接口
    AccountMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.example.mapper.AccountMapper">
    
    </mapper>
    

    AccontMapper接口

    package org.example.mapper;
    
    public interface AccountMapper 
        @Insert("insert into tbl_account(name,money)values(#name,#money)")
        void save(Account account);
    
        @Delete("delete from tbl_account where id = #id ")
        void delete(Integer id);
    
        @Update("update tbl_account set name = #name , money = #money where id = #id ")
        void update(Account account);
    
        @Select("select * from tbl_account")
        List<Account> findAll();
    
        @Select("select * from tbl_account where id = #id ")
        Account findById(Integer id);
    
    

    在这一部分定义sql语句

  5. 编写service方法负责业务逻辑层,主要是调用数据库
    准备工具类:SqlSessionFactoryUtils

    package org.example.util;
    
    public class SqlSessionFactoryUtils 
        private static SqlSessionFactory sqlSessionFactory;
        static
            try 
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
             catch (IOException e) 
                e.printStackTrace();
            
        
        public static SqlSessionFactory getSqlSessionFactory()
            return sqlSessionFactory;
        
    
    

    编写AccountService接口

    public interface AccountService 
        List<Account> findAll();
    
    

    AccountService.java

    package org.example.service.impl;
    
    public class AccountServiceImpl implements AccountService 
        private SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
    
        @Override
        public List<Account> findAll() 
            SqlSession session = factory.openSession();
            AccountMapper mapper = session.getMapper(AccountMapper.class);
            List<Account> accounts = mapper.findAll();
            session.close();
            return accounts;
        
    
    
  6. 接下来应该是在servlet类里面调用service方法,这里写在main函数里面

    package org.example;
    
    public class Main 
        public static void main(String[] args) 
            AccountService service = new AccountServiceImpl();
            List<Account> accounts = service.findAll();
            System.out.println(accounts);
        
    
    

即可成功获取到数据库数据
当Spring需要整合mybatis时,真正需要交给Spring管理的是SqlSessionFactory

2.2 整合:导入依赖:pom.xml

<dependencies>
    <!-- spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <versionspring boot框架学习学前掌握之重要注解-java配置方式

spring boot框架学习学前掌握之重要注解-通过java的配置方式进行配置spring

spring boot框架学习学前掌握之重要注解-通过java的配置方式进行配置spring

spring之@Profile注解

Java 之Spring框架注解基本使用

好程序员Java干货分享Spring框架之IOC原理