Spring学习

Spring学习总结二

Spring最重要的当然是注解开发啦~接下来就是要通过注解来替代在xml文件中的Bean标签,来简化我们的开发步骤。在第二次总结中,我们要掌握这些注解。

一:Spring原始注解

注解 说明
@Component 使用在类上用于实例化Bean。把资源让 spring 来管理。相当于在 xml 中配置一个 bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入。自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
@Qualifier 结合@Autowired一起使用用于根据名称进行依赖注入。在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
@Resource 相当于@Autowired+@Qualifier,按照名称进行注入JDK9版本之后就无法使用了
@Value 注入基本数据类型和 String 类型数据的
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

我们还使用刚才总结一的案例,把总结一的案例的bean使用注解给替换掉。

先注解dao层的Bean::envelope_with_arrow:UserDaoImpl

1
2
3
4
5
6
7
8
9
10
11
package com.liu.dao.Impl;
import com.liu.dao.UserDao;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
//<bean id="userDao" class="com.liu.dao.Impl.UserDaoImpl"></bean>
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDao被创建了。。。。");
}
}

再注解service层的Bean:e-mail:UserServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.liu.service.Impl;

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

import javax.annotation.Resource;

@Service("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();
}
}

是不是以为,这就行了?我们来运行web层的程序来测试一下:

在这里插入图片描述

what???

为啥报错了???

这???

查!!!给我查!!!

经过一段百度时间

嗖嘎!!!

​ ——戏精上线

*注意:

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

还是先创建Spring的核心配置文件,在配置文件中加入:

1
2
<!--配置注解扫描-->
<context:component-scan base-package="com.liu"/>

注解详解:

1.@Autowired:

按照数据类型从Spring容器中进行匹配的 ,但是需要注意:这个可以单独使用,但是,当容器中出现多个UserDao就会找不到到底是哪一个UserDao。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.liu.service.Impl;
import com.liu.dao.UserDao;
import com.liu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
//按照数据类型从Spring容器中进行匹配的 但是需要注意:这个可以单独使用,但是,当容器中出现多个UserDao就会找不到到底是哪一个UserDao
private UserDao userDao;
public void save() {
userDao.save();
}
}
2.@Qualifier(“userDao”) :

是按照id值从容器中进行匹配的 但是主要此处@Qualifier和@Autowired一起使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.liu.service.Impl;
import com.liu.dao.UserDao;
import com.liu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
//按照数据类型从Spring容器中进行匹配的 但是需要注意:这个可以单独使用,但是,当容器中出现多个UserDao就会找不到到底是哪一个UserDao
@Qualifier("userDao")
private UserDao userDao;
public void save() {
userDao.save();
}
}
3.@Resource

相当于@Autowired+@Qualifier

1
2
3
4
5
6
7
8
9
10
11
package com.liu.dao.Impl;
import com.liu.dao.UserDao;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
//<bean id="userDao" class="com.liu.dao.Impl.UserDaoImpl"></bean>
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDao被创建了。。。。");
}
}
4.@Value

注入基本数据类型和 String 类型数据的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.liu.service.Impl;
import com.liu.dao.UserDao;
import com.liu.service.UserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserServiceImpl implements UserService {
@Value("driver")
private String driver;
@Resource(name = "userDao")
private UserDao userDao;
public void save() {
userDao.save();
}
}

what?

就这??

我直接初始化不好吗???

1
private String driver=driver;

还搞个注解????

既然它现在还存在,必定有它存在的道理。我们用另一种方式来打开新世界的大门。

我们知道我们在学习数据库连接池的时候,可以把driver,user,password,url都给抽取出来,抽到一个properties文件中。那么问题来啦,Spring能不能把这个properties存到容器中呢?当然能!

在Spring核心配置文件中加入

1
2
<!--引入properties配置文件-->
<context:property-placeholder location="pro.properties"/>

然后使用${}

1
2
@Value("${driver}")
private String driver;

是不是打开了新世界的大门,哈哈。到时候配置dao层的时候就可以这样来配置url、user、password、driver。不过应该不会用到,因为mybatis也可以实现。

5.@Scope
6.@PostConstruct
7.@PreDestroy

这三个注解就不再详细介绍了。@Scope就是标注Bean的作用范围,有两个常用值。

@PostConstruct :设置初始化方法

@PreDestroy:设置销毁方法

二:Spring新注解

1.为什么要学习新注解

在这里插入图片描述

2.新注解有哪些

在这里插入图片描述

3.新注解的详细说明

<1>:@Configuration

该注解是让该类成为Spring的核心配置类

我们创建一个类,然后把该类当作Spring的核心配置类时,就需要使用@Configuration

使用方法:

1
2
3
4
@Configuration      
//该注解是让该类成为Spring的核心配置类
public class SpringConfig {
}
<2>:@ComponentScan

用来指定Spring初始化扫描的包

使用方法:

1
2
3
4
5
6
@Configuration      //该注解是让该类成为Spring的核心配置类
//<!--配置注解扫描-->
//<context:component-scan base-package="com.liu"/>
@ComponentScan("com.liu")
public class SpringConfig {
}
<3>:@PropertySource

用来加载外部配置文件

使用方法:

1
2
3
4
5
6
7
8
9
@Configuration      //该注解是让该类成为Spring的核心配置类
//<!--配置注解扫描-->
//<context:component-scan base-package="com.liu"/>
@ComponentScan("com.liu")
//<!--引入properties配置文件-->
//<context:property-placeholder location="pro.properties"/>
@PropertySource("pro.properties")
public class SpringConfig {
}
<4>:@Bean

使用在方法上,讲返回值存储在Spring容器中

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration      //该注解是让该类成为Spring的核心配置类
//<!--配置注解扫描-->
//<context:component-scan base-package="com.liu"/>
@ComponentScan("com.liu")
//<!--引入properties配置文件-->
//<context:property-placeholder location="pro.properties"/>
@PropertySource("pro.properties")
public class SpringConfig {
@Value("${driver}")
private String driver;
@Bean("getDriver")
public String getDateSource(){
return driver;
}
}

4.如何使用这个核心配置类呢?

使用AnnotationConfigApplicationContext(SpringConfig.class);来使用这个核心配置类。

1
2
3
4
5
6
7
8
9
public class UserWeb {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean(UserService.class);
userService.save();
String driver = (String) context.getBean("getDriver");
System.out.println(driver);
}
}

三:Spring集成junit开发

1.为什么要集成junit开发呢?

为了方便~~

而且到时候为了学习SpringBoot打下良好的基础

在这里插入图片描述

2.集成步骤

在这里插入图片描述

3.步骤详解

<1>在pom.xml中导入坐标

建议大家自行去Maven中央仓库去自行导取

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>

这里要注意:pom.xml必须也要有junit的坐标哦!!!

<2>使用@Runwith注解

首先创建一个包,包内建一个类

1
2
3
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTest {
}
<3>使用@ContextConfiguration注解
1
2
3
4
5
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
//注:也可以使用配置文件@ContextConfiguration("applicationContext.xml")
public class SpringTest {
}
<4>使用@Autowired注入要测试的对象
1
2
3
4
5
6
7
8
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTest {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao;
}
<5>创建测试方法进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTest {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao;
@Test
public void Test01(){
userService.save();
userDao.save();
}
}
点击查看
-------------------本文结束 感谢您的阅读-------------------