- Spring 配置数据源-即配置数据结构
- ①导入数据源的坐标和数据库驱动坐标
- ②创建数据源对象
- ③设置数据源的基本连接数据
- ④使用数据源获取连接资源和归还连接资源
- demo1 ```java <?xml version=”1.0” encoding=”UTF-8”?>
@Test
public void test2() throws SQLException {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
DruidDataSource dataSource = (DruidDataSource) app.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
- 注解开发,使用注解类;见下面demo
- Spring注解开发-原始注解
- 想想前面,我们把类的创建交给Spring,需要在代表Spring的配置文件中进行配置
- 一个对象-一个Bean
- 唯一的id
- 对象的全类名
- 字段-Property(引用数据、基本数据类型、list、map)等
- 这种配置是麻烦的,可以通过注解开发
- 原始注解
- ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22442214/1633792029632-ee75e534-c549-4c4d-b922-4baca99f977f.png#clientId=ue77fa308-a565-4&from=paste&height=270&id=ub34e7096&margin=%5Bobject%20Object%5D&name=image.png&originHeight=539&originWidth=1166&originalType=binary&ratio=1&size=78628&status=done&style=none&taskId=u0c02867c-2a6b-4e30-bec0-9229a86df21&width=583)
- 使用
- 使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
```java
<!--注解的组件扫描-->
<context:component-scan base-package="com.jquan.learn"></context:component-scan>
- 使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化
- **两个要素:全类名,id 都有了,这样Spring就能帮我们创建对象了**
//<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("save running...");
}
}
package com.jquan.learn.service.impl;
import com.jquan.learn.dao.UserDao;
import com.jquan.learn.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.itheima.service.impl.UserServiceImpl">
//@Component("userService")
@Service("userService")
//@Scope("prototype")
@Scope("singleton")
public class UserServiceImpl implements UserService {
@Value("${jdbc.driver}")
private String driver;
//<property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从Spring容器中进行匹配的
//@Qualifier("userDao") //是按照id值从容器中进行匹配的 但是主要此处@Qualifier结合@Autowired一起使用
@Resource(name="userDao") //@Resource相当于@Qualifier+@Autowired
private UserDao userDao;
public void save() {
System.out.println(driver);
userDao.save();
}
@PostConstruct
public void init(){
System.out.println("Service对象的初始化方法");
}
@PreDestroy
public void destory(){
System.out.println("Service对象的销毁方法");
}
}
- Spring 新注解
- 使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如:
- 非自定义的Bean的配置:
- 加载properties文件的配置:
- 组件扫描的配置:
- 引入其他文件:
- 非自定义的Bean的配置:
- 使用Spring新注解
- 定义配置类
- ```java package com.jquan.learn.config;
- 使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如:
import com.alibaba.druid.pool.DruidDataSource; 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;
//
@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(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
Spring 配置类中代入 数据源配置类
```java
package com.jquan.learn.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//标志该类是Spring的核心配置类
@Configuration
//<context:component-scan base-package="com.itheima"/>
@ComponentScan("com.jquan.learn")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}
- 使用注解获得 Spring 容器: ApplicationContext app = new AnnotationConfigApplicationContext(配置类.Class) ```java package com.jquan.learn.web;
import com.jquan.learn.config.SpringConfiguration; import com.jquan.learn.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 userService = app.getBean(UserService.class);
userService.save();
}
}
- Spring 集成Junit
- 原始Junit测试Spring问题
- 在测试类中,每个测试方法都要获取Spring容器
- 集成与使用
- 1导入pom导入坐标
- 2使用@Runwith注解替换原来的运行期内核
- 3使用@ContextConfiguration指定配置文件或配置类
- 4使用@Autowired注入需要测试的对象
- 5创建测试方法进行测试
```java
@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());
}
}