Spring
Spring配置数据源
- 导入相关坐标
- 编写jdbc.properties文件
- 创建applicationContext.xml文件
- spring加载properties文件
- 配置Druid和Jdbc Template
- 创建数据库并添加数据
- 定义student类
8.测试
1. 导入相关坐标
<dependencies>
<!--添加lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!--spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring整合junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--spring和新坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 编写jdbc.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_test1?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=1234
3. 创建applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解-->
<context:component-scan base-package="com.lifly"/>
</beans>
4. spring加载properties文件
<!--通过context:property-placeholder 记载jdbc.properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
5. 配置Druid和Jdbc Template
<!--配置Druid数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
6. 创建数据库并添加数据
-- 创建数据库
CREATE DATABASE spring_test1;
-- 使用数据库
USE spring_test1;
-- 创建student表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL,
age INT
);
-- 添加数据
INSERT INTO student(NAME,age) VALUES ('张三',13);
INSERT INTO student(NAME,age) VALUES ('李四',14);
7. 定义student类
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@Component
public class Student {
private Long id;
private String name;
private int age;
}
8.测试
public class StudentTest {
@Test
public void studentTest(){
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = classPathXmlApplicationContext.getBean(JdbcTemplate.class);
String sql = "select * from student";
List<Student> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));
for (Student student : list) {
System.out.println(student);
}
}
@Test
public void studentTest01(){
ClassPathXmlApplicationContext cp = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService students = cp.getBean(StudentService.class);
List<Student> student = students.getStudent();
for (Student student1 : student) {
System.out.println(student1);
}
}
}
Spring 原注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解是一种趋势,注解代替xml配置文件简化配置,提高开发效率
Spring5.0以前提供了注解成为原始注解
开启注解
<!--开启注解-->
<context:component-scan base-package="com.lifly"/>
base-package表示扫描包的范围,如果配置到某个包的路径,那么注解只能在该包下的文件使用注解,配置的越详细注解范围越小,相反配置越少,则使用的注解范围越大。
Ioc注解
注释 | 说明 |
---|---|
@Component | 使用在该类上用于实例化Bean相当于 |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repositiry | 使用在dao层类上用于实例化Bean |
例如以下代码
@Controller
public class helloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("hello spring mvc");
return "WEB-INF/jsp/hello.jsp";
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Repository
public class StudentDaoImpl implements StudentDao {
@Autowired
private JdbcTemplate jdbcTemplate;
DI注解
注释 | 说明 |
---|---|
@Autowired | 使用在字段上用于根据类型依赖注入,相当于根据类型注入 |
@Qualifier | 结合@Autowired一起使用,根据id查找同类型下的实例 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
例如以下代码
@Service
@Scope("singleton")
public class UserServiceImpl implements UserService {
/**
* 当该接口有多个实现类,会出现以下问题
* No qualifying bean of type 'com.lifly.dao.UserDao' available:
* expected single matching bean but found 2: userDaoImpl,userMysqlDaoImpl
* 这时需要添加@qualifier注解,表明使用当前的实现类
* @Autowired and @Qualifier == @Resource
* @Autowired可以再set方法,也可以写在属性上
*/
//@Autowired
//@Qualifier("userMysqlDaoImpl")
@Resource(name = "userMysqlDaoImpl")
private UserDao userDao;
/* public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}*/
其他注解
注释 | 说明 |
---|---|
@Scope | 标注Bean的作用范围 singleton:单例对象(默认) prototype:多例对象 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestory | 使用在方法上标注该方法是Bean的销毁对象 |
@Value | 注入普通属性,主要用于读取配置文件中的值,并赋值给当前属性 |
例如以下代码
@Service
@Scope("singleton")
public class UserServiceImpl implements UserService {
@PostConstruct
public void init(){
System.out.println("init方法执行了");
}
@PreDestroy
public void destroy(){
System.out.println("destroy方法执行了");
}
}
public class DataSourceConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 抽取数据源配置信息
* @return
*/
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
//驱动
dataSource.setDriverClassName(driverClassName);
//url
dataSource.setUrl(url);
//username
dataSource.setUsername(username);
//password
dataSource.setPassword(password);
return dataSource;
}
}
Spring注解整合JDBC
- 创建maven工程
- 编写Dao和实现类
- 编写Service和实现类
- 编写applicationContext.xml
- 编写测试类
1. 创建maven工程
2. 编写Dao和实现类
public interface StudentDao {
/**
* 创建方法
*/
public List<Student> getStudent();
}
@Repository
public class StudentDaoImpl implements StudentDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 创建方法
*/
@Override
public List<Student> getStudent() {
String sql = "select * from student";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));
}
}
3. 编写Service和实现类
public interface StudentService {
/**
* 获取所有学生信息
* @return
*/
public List<Student> getStudent();
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public List<Student> getStudent() {
return studentDao.getStudent();
}
}
4. 编写applicationContext.xml
<!--开启注解-->
<context:component-scan base-package="com.lifly"/>
<!--通过context:property-placeholder 记载jdbc.properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置Druid数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
5. 编写测试类
@Test
public void studentTest01(){
ClassPathXmlApplicationContext cp = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService students = cp.getBean(StudentService.class);
List<Student> student = students.getStudent();
for (Student student1 : student) {
System.out.println(student1);
}
}
Spring新注解
Spring5.0以后的注解成为新注解
注解 | 说明 |
---|---|
@Configuration | 表示当前类是一个配置类,用于代替配置文件,相当于applicationContext.xml文件 |
@Bean | 作用于方法上,用于将方法的返回值存入spring容器中 |
@PropertySource | 用于加载指定的配置文件,相当于<context:property-placeholder location=""/> |
@ComponentScan | 用于指定扫描路径 Value:用于指定路径数组basePackage:和value一样相当于 <context:component-scan base-package=""/> |
@Import | 用于合并配置类,相当于"<“import resource=”"><"/import"> |
例如
@Configuration //配置类注解
@PropertySource("classpath:jdbc.properties") //引入外置配置文件
@ComponentScan("com.lifly")
@Import(DataSourceConfig.class)
public class SpringApplicationContextConfig {
Spring 整合Junit
- 导入继承的依赖:pring-test.jar junit-4.12.jar
- 使用@Runwith指定运行时加载配置文件或配置类的主类SpringJunit4ClassRunner
- 使用@ContextConfiguration指定配置文件或配置类Value,locations:用来指定配置文件;Classes:用来指定配置类 使用@Autowired将依赖的bean自动注入
1. 导入继承的依赖:pring-test.jar junit-4.12.jar
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring整合junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2. 加载配置文件
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJunitTest {
/**
*Spring整合junit
* @RunWith()指定运行时家在配置文件或配置类的主类SpringJunit4ClassRunner
* @ContextConfiguration指定配置文件或配置类
* Value,locations:用来指定配置文件
* Classes:用来指定配置类
* 使用@Autowired将依赖的bean自动注入
*/
@Autowired
private StudentService studentService;
@Test
public void test01(){
List<Student> student = studentService.getStudent();
for (Student student1 : student) {
System.out.println(student1);
}
}
}
3. 加载配置类
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringApplicationContextConfig.class)
public class SpringJunitTest2 {
/**
* junit测试配置类SpringApplicationContextConfig.class
*/
@Autowired
private StudentService studentService;
@Test
public void test(){
List<Student> student = studentService.getStudent();
for (Student student1 : student) {
System.out.println(student1);
}
}
}