项目创建同 Mybatis 或参考
https://www.jianshu.com/p/dd6442b32150
文件格式
学习:
在pom.xml中导入spring
<!-- spring 配置文件-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
</dependencies>
<!-- Java 测试类 可以使用@Test注解进行测试 --><dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope></dependency><!-- 普通数据库驱动--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version></dependency><!-- C3P0数据库连接池--><dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version></dependency><!-- Druid 数据库连接池--><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version></dependency>
Spring 优点
不需要new 就可以实例化对象,调用对象的方法
Spring 开发步骤
1.pom.xml 中导入Spring 信息
<!-- spring 配置文件-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcontext</artifactId>
//只需要填写这个,剩下的自动填入
<version>5.0.5.RELEASE</version>
</dependency>
</dependencies>
2.编写applicationContext.xml文件,完成构造器注入
自动执行无参构造创建对象
<bean id="userdao" class="com.fullstuck.dao.impl.UserDaoImpl"></bean> //id 为标识名,随便起 class为实现类的位置 默认执行无参构造
3.完成Bean 以及实现类
编写 interface 定义方法,并实现方法
4.通过指定方法,访问Bean中的方法
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //读取核心xml 文件
User userdao = (User) app.getBean("userdao"); //读取指定id 在.xml中配置的类的id值
userdao.speak(); //读取指定方法 speak() 为方法的名字
applicationContext中的一些参数:
<bean> :
id 唯一的类标识符
class 类的位置
scope 指对象作用范围,有以下取值:
singleton 默认值,单例
prototype 多例
request WEB中,Spring创建一个Bean对象,将对象存入request中
session WEB中,Spring创建一个Bean对象,将对象存入session中
global session WEB中,应用在Portlet环境中,如果没有Portlet环境那么global session 相当于session
当scope 取值为singleton 时,在加载Spring核心文件时对象就被创建
prototype时,在每一次getBean方法执行时创建对象
init-method Bean创建时执行的方法
destroy-method Bean销毁时执行的方法
factory-method 如果class的值写的是工厂的位置而不是要实例化类的位置,factory-method则写你想执行代理工厂的方法
例子: <!-- 采用工厂类实现 class写工厂的位置,factory-method 为工厂要执行的方法(自定义实例化)-->
<bean id="userdao" class="com.fullstuck.factory.Staticfactory" factory-method="getuser"></bean>
factory-bean 非静态工厂注入时,选择注入的工厂id 值
<property> 属性注入,依赖注入 set
name 名字
value 普通属性的值
ref 注入对象,引入的值
<list> list集合
<map> map集合
<constructor-arg> 属性注入,依赖注入 构造方法
name 名字
value 普通属性的值
ref 注入对象,引入的值
<list> list集合
<map> map集合
<import> 导入其他spring .xml文件
实际开发中,Spirng所需配置文件非常的多,这导致主体Spring文件非常巨大,所以可以将主配置文件按照模块,或分层来
进行拆分,再在主文件中通过import 引入其他分文件
文件名格式: applicationContext-***.xml *** 为别名
引入格式: <import resources = "applicationContext-***.xml ">
引入所有: <import resource="applicationContext-*.xml"/> 默认引入所有 applicationContext-*.xml
Spring中注入的方法:
通过Spring 嵌套的注入创建对象,可以实现很多功能
1.普通注入(默认为无参构造) 实例化
<bean id="userdao" class="com.fullstuck.dao.impl.UserDaoImpl" ></bean>
id 唯一的类标识符
class 类的位置
2.静态工厂注入 实例化
可以自定义实例化对象的方式,在工厂设置有参构造等
工厂bean
<bean id="userdaobyfactory" class="com.fullstuck.factory.Staticfactory" factory-method="getuser"></bean>
id 唯一的类标识符
class 写工厂的位置
factory-method 为工厂要执行的方法(自定义实例化)
工厂类:
注意必须是public static 开头
//手动实例化
public static User getuser(){
return new UserDaoImpl();
}
3.非静态工厂注入 实例化
可以自定义实例化对象的方式,在工厂设置有参构造等
工厂bean
<bean id="userdaobyfactory02" class="com.fullstuck.factory.NoStaticFactory"></bean>
id 唯一的类标识符
class 写工厂的位置
要实例化的bean
<bean id="userdaoby_nostaticfactory" factory-bean="userdaobyfactory02" factory-method="getuser"></bean>
id 唯一的类标识符
factory-bean 对应工厂类的id 值
factory-method 工厂类要执行的方法
工厂类:
注意必须没有 static 开头
//手动实例化
public User getuser(){
return new UserDaoImpl();
}
Spring Bean 依赖注入的概念
* 介绍:
IOC 控制反转:之前需要我们自己创建的对象现在交给IOC容器来实现
DI 依赖注入
可注入类型:(可传入参数)
普通数据类型
引入数据类型 (对象,其他类)
集合数据类型
持久层:Dao层 定义具体实现方法的位置
业务层:实现层,向用户展示的层
依赖注入是Spring框架核心IOC的具体实现,在编写程序时,通过控制反转,把对象的创建交给Spring,但是代码中不可能出现没有以来的状况
IOC只是减少耦合不会消除。例如:业务层还是会调用持久层的方法,那种业务层和持久层的依赖关系,在使用Spring之后就让Spring来维护了。
简单的说,就是通过Spring框架把持久层传入业务层,不用我们自己通过容器去获取。使用时只需要调用业务层的对象就可以
或者说,就是在业务层里调用持久层的方法,不使用 new ClassPathXmlApplicationContext("applicationContext.xml");这个
而是使用Spring 依赖注入,注入到.xml中,自动完成调用
* 使用set方法实现依赖注入: property
不管引入的类型是对象还是普通数据还是集合,流程都一样
首先在业务层 引入要实现的持久层的对象,并且设置set方法
注入对象:
//通过set方法注入UserDao
private UserDaoImpl userDaoimpl;
//设置set方法
public void setUserDaoimpl(UserDaoImpl userDaoimpl) {
this.userDaoimpl = userDaoimpl;
}
注入普通数据:
//引入名字 依赖注入
private String studentname;
//设置set方法
public void setStudentname(String studentname) {
this.studentname = studentname;
}
注入集合:
//注入list
private List<String> list;
//注入map
private Map<String,String> map1;
//注入含有对象的map
private Map<String, Student> stu_map;
然后再 applicationContext.xml中配置依赖注入
依赖注入对象,普通参数,list
持久层 bean 配置
<bean id="userdao" class="com.fullstuck.dao.impl.UserDaoImpl" ></bean>
业务层配置
<bean id="userservice" class="com.fullstuck.service.impl.UserServiceimpl">
<property name="userDaoimpl" ref="userdao"></property> //name为set方法后的名字,注意第一个字母小写(引入对象)
//ref 为依赖注入 引用持久层的 bean 的 id值,把这个值
通过set方法引入(就是set传入的参数)
<property name="studentname" value="卢本伟"></property> //name为数据变量的名字 value为值
<property name="list"> //注入list name为集合的名字
<list>
<value>卢本伟</value> //直接设置value 值
<value>123</value>
<value>456</value>
</list>
</property>
<!-- 依赖注入普通map-->
<property name="map1"> //注入map name为集合的名字
<map>
<entry key="name" value="大司马"></entry> //entry为默认引入 key ,value 均自定义
<entry key="age" value="222"></entry>
<entry key="city" value="芜湖"></entry>
</map>
</property>
<!-- 依赖注入对象-->
<property name="stu_map"> //注入map name为集合的名字
<map>
<!-- 这里的引入对象 也需要在.xml中配置,并不是class那种写路径引入。引入的是对应的bean 的 id 值 -->
<entry key="men1" value-ref="student01"></entry> //key 为自定义的 value 为引入其他bean的id值
<entry key="men2" value-ref="student02"></entry> //引入的student在下面
<entry key="men3" value-ref="student03"></entry>
</map>
</property>
</bean>
<!-- student 类-->
<!-- 创建多个对象 被上面的map引用-->
<bean id="student01" class="com.fullstuck.demo.Student">
<property name="name" value="吕丰轩"></property>
<property name="age" value="21"></property>
<property name="city" value="大连"></property>
</bean>
<bean id="student02" class="com.fullstuck.demo.Student">
<property name="name" value="张佳伟"></property>
<property name="age" value="21"></property>
<property name="city" value="阜新"></property>
</bean>
<bean id="student03" class="com.fullstuck.demo.Student">
<property name="name" value="李泽宁"></property>
<property name="age" value="21"></property>
<property name="city" value="阜新"></property>
</bean>
property 属性:
name: 引用的为对象时,name为业务层(service)set方法后的名字,注意第一个字母小写,剩下其余的不变
例:setUserDaoimpl 为set方法的名字,此时在.xml中,property 的name 属性就是 userDaoimpl
引用的为普通数据时,name就是那个变量的名字 value就为变量的名字
ref: 为依赖注入 引用持久层(dao)的 bean 的 id值
value:为引入普通变量时,普通变量的值,这个值是多少就在这写
* 使用构造器完成依赖注入: constructor-arg
不管引入的类型是对象还是普通数据还是集合,流程都一样
首先在业务层 引入要实现的持久层的对象,并且设置构造方法
//通过有参构造注入UserDao
private UserDaoImpl userDaoimpl;
//有参构造
public UserServiceimpl(UserDaoImpl userDaoimpl) {
this.userDaoimpl = userDaoimpl;
}
然后再 applicationContext.xml中配置依赖注入
持久层 bean 配置
<bean id="userdao" class="com.fullstuck.dao.impl.UserDaoImpl" ></bean>
业务层配置
<bean id="userservice" class="com.fullstuck.service.impl.UserServiceimpl">
<constructor-arg name="userDaoimpl" ref="userdao"></constructor-arg> //name为构造器传入对象的名字,注意是对象不是类名
</bean> //ref 为依赖注入 引用持久层的 bean 的 id值,把这个值
通过set方法引入(就是set传入的参数)
constructor-arg 属性:
name: 引用的为对象时,name为构造器传入对象的名字,注意是对象不是类名
例:public void setUserDaoimpl(UserDaoImpl userDaoimpl) 这里传入对象名字为 userDaoimpl,这里的name就用 userDaoimpl
ref: 为依赖注入 引用持久层(dao)的 bean 的 id值
数据库连接池:
连接池是采用了预先建立多个数据库连接对象,然后放到连接池里,当有客户端请求时,取出一个连接对象为客户端服务,当请求完成时,客户端调用
.close()方法,将连接对象放回池中。 在普通的数据库连接中,客户端得到的是物理连接,在连接池中,客户端得到的是连接对象,从使用开始到
使用结束,连接对象的物理连接始终没有关闭,所以我们在一定程度上减少了建立连接所需要的时间,这对多使用、高并发的网站十分有利。
C3P0数据库连接池:
ComboPooledDataSource source = new ComboPooledDataSource(); //建立对象
source.setDriverClass("com.mysql.jdbc.Driver"); //配置数据库信息
source.setJdbcUrl("jdbc:mysql://localhost:3306/fruit");
source.setUser("root");
source.setPassword("root");
Connection connection = source.getConnection(); //连接数据库 后续操作和普通JDBC一样了
System.out.println(connection); //打印连接信息,说明连接上了
connection.close();
Druid数据库连接池
DruidDataSource source = new DruidDataSource(); //建立对象
source.setDriverClassName("com.mysql.jdbc.Driver"); //配置数据库信息
source.setUrl("jdbc:mysql://localhost:3306/fruit");
source.setUsername("root");
source.setPassword("root");
Connection connection = source.getConnection(); //连接数据库 后续操作和普通JDBC一样了
System.out.println(connection); //打印连接信息,说明连接上了
connection.close();
Spring 配置数据库连接池:
查看C3P0.txt
'