Spring基础概念

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值