Spring基础概念
1.什么是Spring?
Spring是一个开源的用来简化开发的应用程序框架。
1.1简化开发
Spring对一些常用的API做了封装,简化了程序代码(例如使用Spring JDBC访问数据库)就不用考虑连接的获取和关闭。
1.2解耦
Spring帮助我们管理对象之间的关系,便于程序的维护。
1.3集成
可以集成其他的一些框架(例如:mybatis等)
2.Spring容器
Spring框架是一个核心模块用来管理对象的。
由于Spring中存储javaBean对象(就是符合一定规范的java对象),所以也称之为Spring是javaBean容器,Spring管理javaBean容器。
3.Spring核心功能之一——Spring IOC
3.1Spring IOC:
对象之间的依赖关系交给Spring来建立(用来管理创建,修改javaBean属性等);
3.2DI:
容器通过调用对象的set方法和对象的构造器来建立对象之间的依赖关系;
总结:
IOC是目标,DI是手段;
4.IOC创建对象方式
1.使用无参构造方法创建对象(默认)
2.工厂模式
3.有参构造方法创建对象
4.1使用无参构造方法创建对象(默认)
1.Person类:
package user;
public class Person {
String username;
Student student;
public Person(){
System.out.println("这是person的构造方法");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("这是set方法");
this.username = username;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
System.out.println("set注入");
this.student = student;
}
@Override
public String toString() {
return "Person [username=" + username + ", student=" + student + "]";
}
}
2.Student类:
package user;
public class Student {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
3.Xml配置文件
给person对象name属性赋值和将student对象注入到person对象中
Spring IOC用于管理javaBean对象
id是Spring容器管理bean的唯一标识符
class为对象的包名.类名
property标签:用于注入Bean对象属性
ref:表示将bean的id对应的对象以set形式注入到另一个bean对象中
<bean id="person" class="user.Person">
<!--给对象赋值-->
<!-- <property name="username" value="超哥"></property> -->
<property name="username">
<value>PDD</value>
</property>
<property name="student" ref="stu"></property>
</bean>
<bean id="stu" class="user.Student">
<property name="name">
<value>马云</value>
</property>
<property name="age">
<value>20</value>
</property>
</bean>
4.Test测试类
public class Test {
public static void main(String[] args) {
//根据Spring提供的上下文创建spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过spring帮助我们创建对象
Person p=(Person)ac.getBean("person");
System.out.println(p);
}
}
5.结果:
Person [username=PDD, student=Student [name=马云, age=20]]
4.2工厂模式
简单理解就是利用方法创建对象,将对象复杂的创建过程封装到方法中,使用的时候调用方法就重用了复杂的对象创建过程,简洁的得到了对象。
1.Xml配置文件
<!--利用静态工厂方法创建javaBean对象-->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"/>
<!--利用bean对象的工厂方法创建对象(动态工厂方法)-->
<bean id="date" class="java.sql.Date" factory-bean="cal" factory-method="getTime"/>
2.测试
public class testFactory {
@Test
public void Factory01(){
//创建spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext3.xml");
//获取是spring容器中bean对象
Calendar c=ac.getBean("cal",Calendar.class);
System.out.println(c);
//获取bean对象
Date date=ac.getBean("date",Date.class);
System.out.println(date);
}
}
3.运行结果
java.util.GregorianCalendar[time=1622048519112,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=4,WEEK_OF_YEAR=22,WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_YEAR=147,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=1,HOUR_OF_DAY=1,MINUTE=1,SECOND=59,MILLISECOND=112,ZONE_OFFSET=28800000,DST_OFFSET=0]
Thu May 27 01:01:59 CST 2021
4.3构造方法创建
spring注入方式有两种:
1.set注入(重点)
2.构造方法注入
constructor-arg标签用于实现构造器参数注入
index用于指定构造器参数的下标
1.Xml配置文件
<!--构造方法注入方式3种-->
<!--方式一:下标注入-->
<!-- <bean id="teacher" class="user.Teacher">
<constructor-arg index="0" value="超超"/>
<constructor-arg index="1" value="20"/>
</bean> -->
<!--方式二:类型注入(不推荐使用)-->
<!-- <bean id="teacher" class="user.Teacher">
<constructor-arg type="java.lang.String" value="超超"/>
<constructor-arg type="int" value="20"/>
</bean> -->
<!--方式三-->
<bean id="teacher" class="user.Teacher">
<constructor-arg name="name" value="超超"/>
<constructor-arg name="age" value="20"/>
</bean>
2.Teacher类
package user;
public class Teacher {
private String name;
private int age;
public Teacher(String name, int age) {
System.out.println("有参构造器");
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
3.Test测试类
public class Testcon {
@Test
public void test(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext4.xml");
System.out.println(ac.getBean("teacher",Teacher.class));
}
}
4.运行结果:
有参构造器
Teacher [name=超超, age=20]
5.其他类型的注入格式
1.构建 Person类
package user;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Person2 {
private String name;
private Address address;
private String[] movie;//电影
private List<String> like;//爱好
private Map<String,Object> card;//银行卡
private Set<String> games;//游戏
private String lovePerson;//爱人
private Properties init;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getMovie() {
return movie;
}
public void setMovie(String[] movie) {
this.movie = movie;
}
public List<String> getLike() {
return like;
}
public void setLike(List<String> like) {
this.like = like;
}
public Map<String, Object> getCard() {
return card;
}
public void setCard(Map<String, Object> card) {
this.card = card;
}
public Set<String> getGames() {
return games;
}
public void setGames(Set<String> games) {
this.games = games;
}
public String getLovePerson() {
return lovePerson;
}
public void setLovePerson(String lovePerson) {
this.lovePerson = lovePerson;
}
public Properties getInit() {
return init;
}
public void setInit(Properties init) {
this.init = init;
}
@Override
public String toString() {
return "Person2 [name=" + name + ", address=" + address + ", movie=" + Arrays.toString(movie) + ", like=" + like
+ ", card=" + card + ", games=" + games + ", lovePerson=" + lovePerson + ", init=" + init + "]";
}
}
2.构建Address类
package user;
public class Address {
String city;
String eare;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getEare() {
return eare;
}
public void setEare(String eare) {
this.eare = eare;
}
@Override
public String toString() {
return "Address [city=" + city + ", eare=" + eare + "]";
}
}
3.Xml配置文件
<bean id="address" class="user.Address">
<property name="city" value="西安"/>
<property name="eare" value="临潼"/>
</bean>
<bean id="person2" class="user.Person2">
<!--1.普通注入 value-->
<property name="name" value="刘永超"/>
<!--2.bean注入 ref-->
<property name="address" ref="address"/>
<!--3.数组注入 <array>标签-->
<property name="movie">
<array>
<value>醉拳</value>
<value>骑士</value>
<value>功夫</value>
<value>釜山行</value>
</array>
</property>
<!--4.List注入 <list>标签-->
<property name="like">
<list>
<value>乒乓求</value>
<value>足球</value>
<value>篮球</value>
</list>
</property>
<!--5.Map注入 <map>标签-->
<property name="card">
<map>
<entry key="身份证" value="15185161515"/>
<entry key="银行卡" value="15233333333"/>
</map>
</property>
<!--6.Set注入 set注入-->
<property name="games">
<set>
<value>王者荣耀</value>
<value>和平精英</value>
</set>
</property>
<!--7.null或者空字符串-->
<property name="lovePerson">
<!--<null>-->
<value>""</value>
</property>
<!--8.Properties -->
<property name="init">
<props>
<prop key="userName">admin</prop>
<prop key="userPwd">123456</prop>
</props>
</property>
</bean>
4.测试
public class TestsetDI {
@Test
public void test(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext5.xml");
Person2 p=ac.getBean("person2",Person2.class);
System.out.println(p);
}
}
5.运行结果
Person2 [name=刘永超, address=Address [city=西安, eare=临潼], movie=[醉拳, 骑士, 功夫, 釜山行], like=[乒乓求, 足球, 篮球], card={身份证=15185161515, 银行卡=15233333333}, games=[王者荣耀, 和平精英], lovePerson="", init={userPwd=123456, userName=admin}]
6.Spring表达式
用处:spring表达式#{}读取bean的id属性并且进行注入
1.xml表达式
<bean id="p2" class="user.Person2">
<property name="name" value="老王"/>
<property name="address" ref="ad"/>
</bean>
<bean id="p" class="user.Person">
<property name="username" value="#{p2.address.city}"/>
<property name="student" ref="stu"/>
</bean>
<bean id="ad" class="user.Address">
<property name="city" value="西安"/>
<property name="eare" value="铜川"/>
</bean>
<bean id="stu" class="user.Student">
<property name="name" value="admin"/>
<property name="age" value="18"/>
</bean>
2.运行结果
Person [username=西安, student=Student [name=admin, age=18]]
将p2对象的address属性的city属性值赋给了p对象的username属性
7.加载数据库连接池的配置文件
1.config文件的db.properties文件
drivername=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/kungedb
name=root
password=521125lyc
maxActive=1
maxWait=8000
2.xml配置文件
读取指定下的后缀为properties文件内容,spring容器会将该文件的内容存放到perperties对象以键值对的形式保存下来.
location=“classpath:读取的地址”.
<util:properties id="db" location="classpath:config/db.properties"/>
<bean id="dateSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="#{db.drivername}"></property>
<property name="url" value="#{db.url}"/>
<property name="username" value="#{db.name}"/>
<property name="password" value="#{db.password}"/>
<property name="maxActive" value="#{db.maxActive}"/>
<property name="MaxWait" value="#{db.maxWait}"/>
</bean>
3.Test测试类
@Test
public void test02() throws SQLException{
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext7.xml");
//spring帮助我们创建对象
BasicDataSource bds=ac.getBean("dateSource",BasicDataSource.class);
//获取连接
Connection conn=bds.getConnection();
System.out.println(conn);
}
4.测试结果
jdbc:mysql://localhost:3306/kungedb, UserName=root@localhost, MySQL Connector Java