Spring(IDEA)
**前言:**该学习记录是本人观看视频学习时整理的笔记,仅作为学习记录和个人学习。
一、概念
spring是分层的java SE/EE应用full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核。
二、优势
- 提供IoC容器,解耦;
- AOP编程的支持
- 声明式事务的支持
- 方便测试
- 方便集成各种框架
- 降低javaEE API的使用难度(封装)
- java源码可供学习
三、开发步骤
-
导入Spring开发的基本坐标
-
编写Dao接口和实现类
-
创建Spring核心配置文件
-
在Spring配置文件中配置UserDaoImpl
-
使用Spring的API获得Bean实例(getBean参数为配置的id)
各步骤示例如下:
-
1.
-
2.
-
3/4.
在recourses中创建Spring配置文件,文件名原则上随意取 -
5.
-
四、Spring配置文件
4.1、Bean标签基本配置
用于配置对象交由Spring来创建。默认情况下他调用的是类中的无参构造,没有无参构造不会创建。
基本属性:id:Bean实例在Spring容器中的唯一标识;class:Bean的全限定名称
4.2、Bean标签范围配置
scope:指对象的作用范围,取值有:
- singleton:默认值,单例的(在Spring中只会创建一个对象。多次new都只是同一个对象。spring核心文件加载时创建Bean对象)
- prototype:多例的(在Spring中可创建/new多个对象。在使用时"getBean()"创建Bean对象)
- request:Web中,Spring创建一个Bean对象,将对象存入到request域中
- session:Web中,Spring创建一个Bean对象,将对象存入session域中
- global session:在Web中,应用在portlet环境,如没有该环境,就等同于session
4.3、Bean的生命周期
-
init-method:初始化方法
-
destroy-method:销毁方法
4.4、Bean实例化的三种方式
- 无参构造方法
- 工厂静态方法(factory-method)
- 工厂实例方法(factory-bean、factory-method)
4.5、Bean依赖注入
- 通过set方法
-
1.
-
2.
name:set的属性(userDao);ref:容器中的目标对象id(userDao)
-
- 通过构造方法
-
1.
-
2.
-
依赖注入数据类型:
-
普通数据类型
-
1.
-
2.
-
-
引用数据类型(如上userService引用userDao)
-
集合数据类型
-
1.
-
2.
-
4.6、import导入其他分标签
<import resource="applicationContext.xml"></import>
五、相关API
5.1、ApplicationContext
5.2、getBean()
- getBean(“id”):当存在多个相同的类时,只能使用id方式获取
- getBean(class):当某个类只存在一个时,可使用类来获取,不需要强转
六、连接池
6.1、c3p0
-
手动直接连接方式(导包)
导入的mysql的包版本在8.0以上要使用"com.mysql.cj.jdbc.Driver"驱动,并修改url中的时区问题
-
加载配置文件方式(.properties文件)
-
Spring配置数据源
-
Spring加载外部配置文件来配置数据源
需要注意,该配置方式需要在context命名空间中配置;同时使用SPEL表达式来设置内容
6.2、druid
-
手动直接使用方式
需要注意时区问题
-
Spring配置数据源
七、注解开发
7.1、原始注解
-
@Component :标准一个普通的spring Bean类
-
@Repository:标注一个DAO组件类
@Repository("userDao") public class userDaoImpl implements userDao { }
-
@Service:标注一个业务逻辑组件类
@Service("userService") public class userServiceImpl implements userService { }
-
@Controller:标注一个控制器组件类
-
@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值
-
@Qualifier(""):按照id名称从容器中匹配,需要结合Autowired
@Autowired @Qualifier("userDao") private userDao userdao; //使用注解方式可以不用写set
-
@Resource():不属于spring的注解,使用该annotation为目标bean指定协作者Bean;相当于@Autowired+@Qualifier("")
@Resource(name = "userDao") private userDao userdao;
-
@Value():注入普通属性
@Value("${jdbc.driver}") private String Driver;
-
@Scope():标注Bean的作用范围
-
@PostConstruct:标注在方法上,表示该方法是Bean的初始化方法
-
@PreDestroy:标注在方法上,表示该方法是Bean的销毁方法
注意,在使用竹节时,需要在配置文件中扫描注解,基包为扫描对象及其子包:
<context:component-scan base-package="com.zjj.maven"/>
7.2、新注解
-
@Configuration:声明当前类是一个配置类(相当于一个Spring配置的xml文件)
-
@ComponentScan:自动扫描指定包下所有使用@Service,@Component,@Controller,@Repository的类并注册
<context:component-scan base-package="com.zjj.maven"/> //相当于
-
@Bean:注解在方法上,声明当前方法的返回值为一个Bean。注册一个Bean,值为方法的返回值
-
@PropertySource:指定文件地址。提供了一种方便的、声明性的机制,用于向Spring的环境添加PropertySource。与@configuration类一起使用。
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> //相当于
-
@Import(xxx.class):导入文件
具体实例:
//核心配置文件(总配置类)
@Configuration //标记为配置类
@ComponentScan("com.zjj.maven") //扫描范围
@Import(dataSourceConfig.class) //导入文件
public class springConfiguration {
}
//分配置类,通过import导入注配置类
@PropertySource("classpath:jdbc.properties") //导入properties文件
public class dataSourceConfig {
@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") //注册一个Bean,为方法的返回值
public DataSource getDataSource()throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(Driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
//加载配置类
ApplicationContext app = new AnnotationConfigApplicationContext(springConfiguration.class);
userService userService = (userService)app.getBean("userService");
DataSource dataSource = (DataSource) app.getBean("dataSource");
Connection conn = dataSource.getConnection();
7.3、springJunit集成测试
- 导入spring集成junit坐标
- @Runwith代替原来的运行期
- @ContextConfiguration指定配置文件或类
- @Autowired注入测试对象
- 创建测试放进行测试
如下:
<!--导入集成junit坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
//测试类
@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 test2() throws Exception{
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
@Test
public void test1(){
userService.save();
}
}
八、AOP
待续。。。。