开篇寄语
这一周完成了SSM框架的学习,每天硬肝,就在小房间里面待着,人都肝傻了
就在昨天完成了整个SSM框架的学习,感觉现在才开始进入了Java后端的门槛,同时在学习的过程中也发现了诸多问题,在学习框架的时候,底层很多实现逻辑都是反射和动态代理,刚好在学Java基础的时候对于这方面的知识掌握不是很好,下星期还得回Java基础去给这些知识过亿遍,每日亿遍,防止抑郁!!!!!
昨天完成了SSM框架的学习并进行了整合,今天抽一天时间给这些笔记给写一写,博客也更新更新,好久没写东西了(其实是看到了一个大牛的一段话,博客还是要多写的,哪怕没人看也要多写多写哈哈哈哈)
下面开始进入正题,整合Spring相关的知识,一些Spring的简介都在Spring篇第一篇博客里面,里面介绍的还是挺全的,下面我就直接跳过简介从注解开始介绍Spring相关知识了,写的不好大家看了多多提出,一起交流,一起学习,共同进步!
一. 注解介绍
1.1 常用注解介绍
在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的销毁方法 |
这里面是一些原始的注解
在我们第一篇笔记中,我们注入Spring对象中使用的是xml配置文件进行注入,现在我们使用注解进行注入能够大大的减少我们的开发步骤,也能达到相同的效果
上面注解的使用方法:
在service业务逻辑层使用@Service(“注入名称”)放在类上面将该类交由Spring进行接管
@Service("userService") //在service层里面实例化Bean对象
public class UserServiceImpl implements UserService {}
在dao层就可以使用@Repository这个注解实例化对象
@Repository("userDao") // 在dao层里面实例化Bean对象
public class UserDaoImpl implements UserDao {}
在我们使用的时候直接使用@Autowired进行注入就好了,这个注解会自动根据类型去扫描Spring容器获取相应类型的实例化对象,或者根据@Resource进行指定名称来进行注入
@Resource(name = "userDao")
private UserDao userDao;
@Controller是放在Controller层里面进行实例化对象的,这个在SpringMVC中会详细介绍这个注解和一些映射注解
1.2 Spring新注解介绍
使用上面的注解还不足以满足Spring注解的开发,我们还需要注解来替代XML文件里面的一些内容
例如:
非自定义的Bean的配置:bean
加载properties文件的配置:context:property-placeholder
组件扫描的配置:context:component-scan
引入其他文件:import
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package=“com.itheima”/>一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
其实吧,我感觉这个没有什么必要,但还是要说一下
大概就是新建一个类,这个类是Spring的核心配置类,这个类相当于applicationContext.xml配置文件,是用来配置一些相关参数的,然后测试的时候调用这个类,而不是调用xml文件
下面是一些实现代码:
核心配置类:
//标志此类为spring核心配置类
@Configuration
//运用与spring容器的组件扫描
@ComponentScan("com.eason")
//加载外部的properties文件
//<context:property-placeholder location="classpath:jdbc.properties" />
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
//加载各种属性,并使用Value注解给各个属性赋值
@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容器当中,标注将该方法的返回值返回到spring容器当中
public DataSource getDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
Connection connection = dataSource.getConnection();
System.out.println("Druid:" + connection);
// connection.close();
return dataSource;
}
}
总配置类
//标志该类是Spring的核心配置类
@Configuration
//注解在各自类中实现了依赖注入,但是配置文件中还需要配置组件扫描
// 会扫描com.eason底下的子包,寻找使用注解的依赖注入
//<context:component-scan base-package="com.eason" />
//<context:property-placeholder location="classpath:jdbc.properties" />
//替代组件扫描的插件
@ComponentScan("com.eason")
//总配置加载分配置,如果有多个的话可以在后面加上
@Import(DataSourceConfiguration.class)
public class SpringConfiguration {
}
在测试方法里面调用该类
//ApplicationContext app = ClassPathXmlApplicationContext("applicationContext.xml");
//使用applicationContext.xml文件进行配置
//ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用核心配置类进行配置
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
//System.out.println(userService.);
userService.save();
//app.close();
这样一些常用的注解就差不多是上面这些了
二. Spring注解开发
2.1 导入maven依赖
这里是maven项目,所以可以直接在pom.xml里面导入坐标就好了,如果不是maven项目的话就需要导入jar包,这里提供一个网址,里面都可以搜到一些常用的jar包的,不过没学maven的小伙伴还是要学一些,因为特别好用
maven中央仓库
这里导入了测试类,和应用上下文和mvc的坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
2.2 编写Dao层实现类
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("我是Dao层的save running...........");
}
}
这里面实例化了Dao层的方法,如果service层要调用Dao层里面的方法的话只需要注入userDao这个对象就可以直接调用了
2.3 编写Service层实现类
@Service("userService")
public class UserServiceImpl implements UserService {
//<property name="userDao" ref="userDao"></property>
//使用注解替代上面的依赖注入
@Autowired //按照数据类型从Spring容器中进行匹配的
@Qualifier("userDao") //是按照id值从容器中进行匹配的,但是主要此处@Qualifier需要和@Autowired结合使用
@Resource(name="userDao") //@Resource相当于@Qualifier+@Autowired
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
这样就可以直接调用到dao层里面的方法了,不用new一个对象,这些都交由Spring来帮你完成,我们只需要将类交由Spring进行托管就好了
同时在配置好以上之后我们还需要在总的配置文件applicationContext.xml上配置上注解扫描,不配置注解扫描的话注解不会生效的
<!--注解在各自类中实现了依赖注入,但是配置文件中还需要配置组件扫描-->
<!--会扫描com.eason底下的子包,寻找使用注解的依赖注入-->
<context:component-scan base-package="com.eason" />
三. Spring集成Junit测试
3.1 传统测试
传统的Spring测试还需要创建两种对象,有点过于繁琐,我们写代码的最终目的就是以最少的代码实现最来劲的功能哈哈哈哈
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
这个是传统的Spring测试代码
那么我们现在就开始集成junit来进行测试
3.2 集成junit测试
3.2.1 导入jar包或maven坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
3.2.2 使用@Runwith来替代原本的运行周期
//使用spring的内核函数测试
@RunWith(SpringJUnit4ClassRunner.class)
这个是放在测试类上的而不是测试方法上
3.2.3 使用@ContextConfiguration指定配置文件或配置类
配置文件就是我们的核心配置文件applicationContext.xml,配置类就是我们上面有提到的自己创建的Spring核心配置类
@ContextConfiguration("classpath:applicationContext.xml")
3.2.4 使用@Autowired注入需要测试的对象
使用@Autowired来根据类型进行注入也行,使用@Resource根据具体名称进行注入也行,这个主要根据个人习惯,反正我的习惯是根据@Autowired进行注入,能让Spring做的就让他做吧,能省一点是一点
@Autowired
private UserService userService;
@Autowired
private DataSource dataSource;
3.2.5 创建测试方法进行测试
这里是总的测试代码
package com.eason.test;
import com.eason.config.SpringConfiguration;
import com.eason.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;
//使用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());
}
}
这个集成junit测试还是很好用的,大家可以看一看!
这篇基于注解的Spring注入的文章就写到这里了,自己水平也不是很高,大家看了有不对的可以多多提出,一起交流,共同学习,共同进步!