栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

IoC和DI注解开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IoC和DI注解开发

Spring配置数据源 数据源(连接池)的作用

数据源(连接池)是提高程序性能出现的
实现实例化数据源,初始化部分连接资源
使用连接资源时从数据源中获取
使用完毕后将资源归还给数据源
常见的数据源(连接池):DBPC、C3P0、BoneCP、Druid等

数据源的开发步骤

1、导入数据源的坐标和数据库驱动坐标
2、创建数据源对象
3、设置数据源的基本连接数据
4、使用数据源获取连接和归还连接资源

数据源的手动创建 手动创建C3P0连接池
 @Test
    //测试手动创建c3p0数据源
    public void test1() throws Exception {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db1?serverTimezone=UTC");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }
手动创建Druid连接池
 @Test
    //测试手动创建druid数据源
    public void test2() throws Exception {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/db1?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        DruidPooledConnection connection = dataSource.getConnection();
        System.out.println(connection);


    }
抽取jdbc.properties配置文件方便解耦

jdbc.properties

jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
jdbc.username = root
jdbc.password = root

读取jdbc.properties配置文件创建连接池

@Test
    //测试手动创建c3p0数据源(加载properties配置文件形式)
    public void test3() throws Exception {
        ResourceBundle rb = ResourceBundle.getBundle("jdbc");
        String driver = rb.getString("jdbc.driver");
        String url = rb.getString("jdbc.url");
        String username = rb.getString("jdbc.username");
        String password = rb.getString("jdbc.password");
        //创建数据源对象,设置连接参数
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);

        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();

    }
Spring配置数据源

可以将DataSourse的创建权交由Spring容器去完成
DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的
DateSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入

 
        
        
        
        
    

测试从容器中获取数据源

@Test
    //测试Soring容器创建c3p0数据源
    public void test4() throws Exception {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        DataSource dataSource = (DataSource) app.getBean("dataSource");
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }
抽取JDBC配置文件

引入context命名空间和约束路径:
命名空间:xmlns:context="http://www.springframework.org/schema/context"
约束路径: http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd





    
    
    
        
        
        
        
    

Spring容器加载properties文件



Spring注解开发 Spring原始注解

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

注解说明
@Component使用在类上用于实例化Bean
@Controller使用在web层类上用于实例化Bean
@Service使用在service层上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean
@Autowired使用在字段上用于根据类型依赖注入
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入
@Value注入普通属性
@Scope标注Bean的作用范围
@PostConstruct使用在方法上标注该方法是Bean的初始化方法
@PreDestroy使用在方法上标注该方法是Bean的销毁方法

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

package com.zg.dao.Impl;

import com.zg.dao.UserDao;
import org.springframework.stereotype.Component;

//
@Component("userDao")
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("save run....");
    }
}

UserService加注解

package com.zg.service.Impl;

import com.zg.dao.UserDao;
import com.zg.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

//
@Component("userService")
public class UserServiceImpl implements UserService {

    //
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }
}

Spring文件中配置

 
    
    
注意:

1、上面方法全使用了@Component注解,其实用@Controller、@Service、@Repository进行注解效果也是一样的,在Dao层如果使用@Autowired和@Qualifier进行注解也是可以不用写set方法的。
2、在将UserDao注入到UserService时使用了@Autowired和@Qualifier,但使用@Autowired也可达到相应的效果,@Autowired是按照数据类型从Spring容器中进行配置的,但如果容器中UserDao有多个Bean,就需要添加@Qualifier并指定相应的ID。@Qualifier是按照ID的值从容器中进行匹配,此处@Qualifier要结合@Autowired注入
3、@Resource(name="userDao")相当于@Autowired+@Qualifier,按照名称进行注入

使用@value进行字符串的注入
package com.zg.service.Impl;

import com.zg.dao.UserDao;
import com.zg.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

//
//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
    @Value("zgDaren")
    private String driver;
    @Value("${jdbc.url}")//在对应的Spring容器中找到key对应的值赋值给url
    private String url;

    //
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        System.out.println(driver);//zgDaren
        userDao.save();
        System.out.println(url);//jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
    }
}

使用@Scope标注Bean的范围
//@Scope("singleton")一个Bean
@Scope("prototype")多个Bean
public class UserServiceImpl implements UserService {
}
使用标注初始化方法,使用标注销毁方法
@PostConstruct
    public void init(){
        System.out.println("初始化方法....");
    }
    @PreDestroy
    public void destory(){
        System.out.println("销毁方法...");
    }  

Spring新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
非自定义的Bean的配置:
加载properties文件的配置:context:property-placeholder
组件扫描的配置:context:component-scan
引入其他文件:

注解说明
@Configuration用于指定当前类是一个Spring配置类,当前创建容器时会从该类上加载注解
@ComponentScan用于指定Spring在初始化容器时要扫描的包,作用和在Spring的xml配置文件中的 一样
@Bean使用在方法上,标注将该方法的返回值存储到Spring容器中
@PropertySource用于加载.properties文件中的配置
@import用于导入其他配置类
新建一个类用于主配置文件
package com.zg.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

//标志该类是Spring的核心配置类
@Configuration
//
@ComponentScan("com.zg")
@import(DataSourceConfiguration.class)//这里是数组,多了可以使用使用逗号隔开
public class SpringConfiguration {


}

存放附属配置文件
package com.zg.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

//负责数据源配置
//
@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;
    }
}

测试类
package com.zg.web;

import com.zg.config.SpringConfiguration;
import com.zg.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserController {
    public static void main(String[] args) {
        //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
                //在使用了注解后,获取不到userService,因为没有告诉Spring有了注解(即需要配置组件扫描)
        UserService userService = (UserService) app.getBean("userService");
        userService.save();
    }
}

Spring集成Junit 原始Junit测试Spring的问题

在测试类中,每个测试方法都有一下两行代码:

ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) app.getBean("userService");

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常,所以又不能轻易删掉

解决方案

让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它
将需要进行测试Bean直接在测试类中进行注入

Spring集成Junit步骤

1、导入Spring集成Junit的坐标
2、使用@Runwith注解替换原来的运行期
3、使用@ContextConfiguration指定配置文件或配置类
4、使用@Autowired注入需要测试的队象
5、创建测试方式进行测试

package com.zg.test;

import com.zg.config.SpringConfiguration;
import com.zg.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.sql.DataSource;
import java.sql.SQLException;

//以前执行测试是直接使用junit
//现在可以是找Spring提供的内核,然后在找junit进行测试,但在找之前可以完成Spring容器的创建、配置文件的加载
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")//指定配置文件的位置
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {

    @Autowired
    private UserService userService;
    @Autowired
    private DataSource dataSource;


    @Test
    public void test1() throws SQLException {
        userService.save();
        System.out.println(dataSource.getConnection());
    }

}

这里需要注意的是,当使用@ContextConfiguration的时候需要将我们之前在applicationContext.xml中剪切的Bean复原,不然会报错。这里也验证了Spring的全注解和从Spring Config中创建的.xml文件可以共存于共一个项目,不用删除Bean的配置。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号