1. 通过maven 下载相关依赖需要的jar 包
<!--打包成jar包-->
<packaging>jar</packaging>
<!--所有相关jar包依赖和下载的区域-->
<dependencies>
<dependency>
<!--spring 包-->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<!--数据访问dbutils包-->
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<!--c3p0,连接池,包-->
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<!--mysql 数据库包-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<!--单元测试包-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
2.创建实体类
3.写出业务逻辑层和数据访问层的接口,以及实现类。实现类中加入固定的IOC封装属性
增删改的实现方法:
实现类中的具体注意代码:
//数据访问实现类具体
//spring 提供进行封装赋值的属性和方法
private QueryRunner runner;
public void setRunner(QueryRunner runner) {
this.runner = runner;
}
//spring 提供进行封装赋值的属性和方法---结束
//业务逻辑实现类具体
//spring 提供进行封装赋值的属性和方法
private IStudentDao studentDao;
public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
}
//spring 提供进行封装赋值的属性和方法---结束
4.配置IOC 容器中的具体属性。也就是配置:applicationContext.xml
知识拓展:scope=“prototype”
<?xml version="1.0" encoding="UTF-8"?>
<!--配置Service -->
<bean id = "studentService" class="huaxin.service.impl.StudentServiceImpl">
<!--实现类的属性,注入dao-->
<property name="studentDao" ref="studentDao"></property>
</bean>
<!--配置Dao对象-->
<bean id ="studentDao" class="huaxin.dao.impl.StudentDaoImpl">
<!--注入QueryRunner-->
<property name="runner" ref="runner"></property>
</bean>
<!--配置QueryRunner对象-->
<bean id = "runner" class="org.apache.commons.dbutils.QueryRunner">
<!--注入c3p0数据源-->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<!--配置c3p0数据源-->
<bean id ="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置c3p0连接数据库的4个基本信息 ,注意c3p0的 name 名是固定的字符。-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
<property name="user" value="root"></property>
<property name="password" value="123"></property>
</bean>
</beans>
5.单元测试类
@Test
public void testquery(){
//1.获取spring IOC容器
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
//2.得到业务层对象
IStudentService ss = ac.getBean("studentService",IStudentService.class);
//3.执行方法
List<Student> students = ss.query();
for (Student student : students) {
System.out.println(student);
}
}
day31 2019-08-30 笔记重点:
三、耦合和解耦
1. 什么是耦合
模块之间的关联程度, 依赖程度
2. 什么是解耦
降低模块之间的耦合度(依赖关系)
3. 解耦的目的
编译器不依赖,运行期才依赖
4. 解耦思路
1) 把全限类名都放到配置文件中
2) 通过工厂帮助创建对象
七、IOC的细节
1、容器对象的类结构图
a、beanFactory 是spring容器的顶层接口
b、接口ApplicationContext是 beanFactory子接口
实现类:ClassPathXmlApplicationContext -- 从类路径之下读取配置文件 (常用)
FileSystemXmlApplicationContext - 从绝对路径指定的配置文件读取
AnnotationConfigApplicationContext -- 纯注解配置使用的类 (常用)
2、getBean方法(掌握)
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//根据名称获取该对象
// Object userDao = ac.getBean("userDao");
// System.out.println(userDao);
// 根据类型获取该对象
// 如果该类型有两个实现类,会执行异常
// UserDao userDao = ac.getBean(UserDao.class);
// System.out.println(userDao);
// 得到是id为userDao1的对象,类型为UserDao接口的实现类
UserDao userDao = ac.getBean("userDao2", UserDao.class);
System.out.println(userDao);
3、bean对象的范围和生命周期(掌握)
springIOC容器默认的单例模式: 单例模式的对象在创建容器时创建,销毁容器时销毁
scope:prototype 原型模式(多例模式):获取时创建,当对象长时间不在被引用, 则被垃圾回收机制回收
scope:singleton :单例模式
scope :request: 请求范围
scope: session : 回话范围
scope:global session :全局范围 -- spring 5的新特性中被删除了
UserDao userDao1 = ac.getBean("userDao", UserDao.class);
System.out.println(userDao1);
UserDao userDao2 = ac.getBean("userDao", UserDao.class);
System.out.println(userDao2);
6、构造方法注入(掌握)
value 属性只能赋值简单的类型:基本数据类型和String类型
ref: pojo类型,复杂类型, 关联创建好的对象
<!--默认创建对象方式,使用默认的空的构造方法创建对象-->
<bean id="user" class="com.itheima.domain.User">
<!--通过构造方法参数的索引赋值-->
<!--<constructor-arg index="0" value="1"></constructor-arg>-->
<!--<constructor-arg index="1" value="张三"></constructor-arg>-->
<!--通过构造方法参数类型赋值-->
<!--<constructor-arg type="java.lang.Integer" value="2"></constructor-arg>-->
<!--<constructor-arg type="java.lang.String" value="李四"></constructor-arg>-->
<!--通过构造方法参数名字赋值-->
<constructor-arg name="id" value="3"></constructor-arg>
<constructor-arg name="username" value="王五"></constructor-arg>
<constructor-arg name="sex" value="男"></constructor-arg>
<constructor-arg name="birthday" ref="birthday"></constructor-arg>
</bean>
<bean id="birthday" class="java.util.Date"></bean>
7、set方法注入属性(常用)(掌握)
<bean id="user2" class="com.itheima.domain.User">
<!--property :属性注入 , 先找到set方法,才能最终找到属性-->
<property name="username" value="王朝"></property>
<property name="birthday" ref="birthday"></property>
<property name="sex" value="男"></property>
<property name="id" value="4"></property>
</bean>
8、p名称空间注入:基于set方法注入--- 了解
a、在头部文件中引入p名称空间
b、使用p名称空间注入属性
<bean id="user3" class="com.itheima.domain.User"
p:id="5" p:username="马汉" p:sex="男" p:birthday-ref="birthday"
></bean>
9、注入集合属性(掌握)
<bean id="user4" class="com.itheima.domain.User">
<!--array ,list ,set 结构相同,标签可以混用-->
<property name="list">
<set>
<value>javaSE</value>
<value>javaEE</value>
<value>javaME</value>
</set>
</property>
<property name="set">
<array>
<value>javaSE</value>
<value>javaEE</value>
<value>javaME</value>
</array>
</property>
<property name="strs">
<list>
<value>javaSE</value>
<value>javaEE</value>
<value>javaME</value>
</list>
</property>
<!--map集合properties结构相同,可以通用-->
<property name="map">
<props>
<prop key="五" >five</prop>
<prop key="六" >six</prop>
<prop key="七" >seven</prop>
</props>
</property>
<property name="properties">
<map>
<!--键值对配置-->
<entry key="一" value="one"></entry>
<entry key="二" value="two"></entry>
<entry key="三" value="three"></entry>
<entry key="四" value="four"></entry>
</map>
</property>
</bean>