Spring学习记录1
1.基本例子
第一步导入导入spring的jar包,或者使用Maven引入spring依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
第二步有一个xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置user类-->
<bean id="user" class="Furrain.User"></bean>
<!--setter注入属性-->
<!-- <bean id="book" class="Furrain.Book">-->
<!-- <!–使用property完成属性注入–>-->
<!-- <property name="bName" value="惊悚乐园"></property>-->
<!-- <property name="bPrice" value="128"></property>-->
<!-- </bean>-->
<!--用有参构造注入属性-->
<bean id="orders" class="Furrain.Orders">
<constructor-arg name="oAddress" value="peiking"></constructor-arg>
<constructor-arg name="oName" value="kimJisoo"></constructor-arg>
</bean>
<!--p空间注入-->
<bean id="book" class="Furrain.Book" p:bName ="异常生物见闻录" p:bPrice="199">
<!-- 注入null-->
<!-- <property name="bAuthor">-->
<!-- <null></null>-->
<!-- </property>-->
<!--特殊符号,如<>
1.html的转义符<>
2.特殊符号写进CDATA
-->
<property name="bAuthor">
<value><![CDATA[<<1122>>]]></value>
</property>
</bean>
</beans>
第三步,使用spring生成类实例
@Test
public void add() {
// 加载配饰文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring/bean1.xml");
User user = context.getBean("user",User.class);
System.out.println(user);
user.add();
}
IOC操作(Bean管理)
1 基于xml
2 基于注解
基于xml
1.依赖注入
1.生成用例
2.依赖注入 DI DI是IOC里的一个步骤吧,感觉。
setter依赖注入
见上面例子
有参构造
见上面例子
注入null.
见上面例子
注入特殊值
见上面例子
注入自定义类对象
前面都是value
外部bean自定义对象需要ref引用其他的bean实例
内部就无所谓了
package Furrain.Dao;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName UserDao
* @createDate 2020/12/13 0:12
* @see Furrain.Dao
*/
public interface UserDao {
public void update();
}
package Furrain.Dao;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName UserDaoImpl
* @createDate 2020/12/13 0:12
* @see Furrain.Dao
*/
public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("UserDao update....");
}
}
package Furrain.Service;
import Furrain.Dao.UserDao;
import Furrain.Dao.UserDaoImpl;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName UserService
* @createDate 2020/12/13 0:13
* @see Furrain.Service
*/
public class UserService {
private UserDao Udao;
public void setUdao(UserDao udao) {
Udao = udao;
}
public void add() {
System.out.println("service add...");
Udao.update();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--外部bean-->
<bean id="userService" class="Furrain.Service.UserService">
<!--注入userDao类对象.
name:需要注入对象的名字
ref:外部的bean
-->
<property name="Udao" ref="userDao"></property>
</bean>
<bean id="userDao" class="Furrain.Dao.UserDaoImpl"></bean>
<!--内部bean-->
<bean id="userService" class="Furrain.Service.UserService">
<property name="Udao">
<bean class="Furrain.Dao.UserDaoImpl"></bean>
</property>
</bean>
</beans>
测试
@Test
public void add() {
ApplicationContext context= new ClassPathXmlApplicationContext("spring/bean2.xml");
UserService uiService = context.getBean("userService",UserService.class);
uiService.add();
}
级联赋值
根据讲述者说明,其实上面的内部bean和外部bean也算级联赋值(意思调用一个类的时候,调用了另一个类,另一个类生成了实例,也进行了初始化赋值)
还有一种在一个bean的内部给另一个bean的值赋值,但是需要一个getter方法
package Furrain.bean;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Emp
* @createDate 2020/12/13 1:03
* @see Furrain.bean
*/
public class Emp {
private String eName;
public void seteName(String eName) {
this.eName = eName;
}
public Dept geteDept() {
return eDept;
}
public void seteDept(Dept eDept) {
this.eDept = eDept;
}
private Dept eDept;
public void printDemo() {
System.out.println(eName);
System.out.println(eDept);
}
}
package Furrain.bean;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Dept
* @createDate 2020/12/13 1:03
* @see Furrain.bean
*/
public class Dept {
private String dName;
public void setdName(String dName) {
this.dName = dName;
}
@Override
public String toString() {
return dName;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dept" class="Furrain.bean.Dept"></bean>
<bean id="emp" class="Furrain.bean.Emp">
<property name="eName" value="王二狗子"></property>
<property name="eDept" ref="dept"></property>
<property name="eDept.dName" value="芯片业务部"></property>
</bean>
</beans>
注入集合属性
数组/list/map/set
package Furrain;
import javafx.scene.control.ListCell;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Stu
* @createDate 2020/12/13 1:25
* @see Furrain
*/
public class Stu {
private String[] courses;
private List<String> likeGirlsList;
private Map<String,String> infoMap;
private Set<String> beLikedGirlsSet;
private List<Pet> pets;
public void setPets(List<Pet> pets) {
this.pets = pets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setLikeGirlsList(List<String> likeGirlsList) {
this.likeGirlsList = likeGirlsList;
}
public void setInfoMap(Map<String, String> infoMap) {
this.infoMap = infoMap;
}
public void setBeLikedGirlsSet(Set<String> beLikedGirlsSet) {
this.beLikedGirlsSet = beLikedGirlsSet;
}
public void printDemo() {
System.out.println(Arrays.toString(courses));
System.out.println(infoMap);
System.out.println(beLikedGirlsSet);
System.out.println(likeGirlsList);
System.out.println(pets);
}
}
package Furrain;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Pet
* @createDate 2020/12/13 1:41
* @see Furrain.Service
*/
public class Pet {
private String pName;
public void setpName(String pName) {
this.pName = pName;
}
@Override
public String toString() {
return pName;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="stu" class="Furrain.Stu">
<property name="courses">
<array>
<value>java</value>
<value>c++</value>
<value>pathon</value>
</array>
</property>
<property name="likeGirlsList">
<list>
<value>张兰</value>
<value>李花</value>
</list>
</property>
<property name="infoMap">
<map>
<entry key="身高" value="177"></entry>
<entry key="体重" value="77"></entry>
</map>
</property>
<property name="beLikedGirlsSet">
<set>
<value>王虎</value>
<value>赵晓华</value>
</set>
</property>
<property name="pets">
<list>
<ref bean="pet1"></ref>
<ref bean="pet2"></ref>
<ref bean="pet3"></ref>
<ref bean="pet4"></ref>
</list>
</property>
</bean>
<bean id="pet1" class="Furrain.Pet" p:pName="花花"></bean>
<bean id="pet2" class="Furrain.Pet" p:pName="草草"></bean>
<bean id="pet3" class="Furrain.Pet" p:pName="小黑"></bean>
<bean id="pet4" class="Furrain.Pet" p:pName="大黄"></bean>
</beans>
提取公共数据
1.xml增加util命名空间,并抽取出公共部分
具体修改
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
<!--**********************这里******************************-->
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--**********************这里******************************-->
<bean id="stu" class="Furrain.Stu">
<property name="courses">
<array>
<value>java</value>
<value>c++</value>
<value>pathon</value>
</array>
</property>
<property name="likeGirlsList">
<list>
<value>张兰</value>
<value>李花</value>
</list>
</property>
<property name="infoMap">
<map>
<entry key="身高" value="177"></entry>
<entry key="体重" value="77"></entry>
</map>
</property>
<property name="beLikedGirlsSet">
<set>
<value>王虎</value>
<value>赵晓华</value>
</set>
</property>
<property name="pets" ref="petList">
</property>
</bean>
<bean id="pet1" class="Furrain.Pet" p:pName="花花"></bean>
<bean id="pet2" class="Furrain.Pet" p:pName="草草"></bean>
<bean id="pet3" class="Furrain.Pet" p:pName="小黑"></bean>
<bean id="pet4" class="Furrain.Pet" p:pName="大黄"></bean>
<!--**********************这里******************************-->
<util:list id="petList">
<ref bean="pet1"></ref>
<ref bean="pet2"></ref>
<ref bean="pet3"></ref>
<ref bean="pet4"></ref>
</util:list>
<!--**********************这里******************************-->
<bean id="teacher" class="Furrain.Teacher">
<property name="pets" ref="petList"></property>
</bean>
</beans>
package Furrain;
import Furrain.Pet;
import java.util.List;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Teacher
* @createDate 2020/12/13 1:54
* @see Furrain.Service
*/
public class Teacher {
public void setPets(List<Pet> pets) {
this.pets = pets;
}
private List<Pet> pets;
public void printDemo() {
System.out.println(pets);
}
}
这样,老师和学生就可以使用一样的pets了…
Bean的分类
普通Bean
之前用到的都是普通Bean,即class定义的是什么类型的,返回的就是什么类型
FactoryBean
返回的是一个不确定类型的对象
例子
package Furrain.FactorBean;
import Furrain.Pet;
import org.springframework.beans.factory.FactoryBean;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName MyBean
* @createDate 2020/12/13 2:30
* @see Furrain.FactorBean
*/
public class MyBean implements FactoryBean<Pet> {
@Override
public Pet getObject() throws Exception {
Pet pet = new Pet();
pet.setpName("王老狗");
return pet;
}
@Override
public Class<?> getObjectType() {
return Pet.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
package Furrain;
/**
* <Description>
*
* @author Furrain
* @version 1.0
* @ClassName Pet
* @createDate 2020/12/13 1:41
* @see Furrain.Service
*/
public class Pet {
private String pName;
public void setpName(String pName) {
this.pName = pName;
}
@Override
public String toString() {
return pName;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置user类-->
<bean id="mybean" class="Furrain.FactorBean.MyBean"></bean>
</beans>
测试
@Test
public void testFactoryBean() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/bean5.xml");
Pet mybean = context.getBean("mybean", Pet.class);
System.out.println(mybean);
}
虽然xml是Mybean,但是实际返回的是pet,实现了FactoryBean接口。
bean的作用域(重要)
1.spring中可以设置生成的是单实例还是多实例
2.默认情况下,spring生成的是单实例
默认下,不管用sprinmg创建多遍,得到的实例地址是一致的,可以自己试一下
如何设置多实例
spring的bean标签中有属性(scope)可以设置
scope的值:
1.默认的:singleton
2.prototype 多实例
区别
singleton与prototype
1.一个单的一个多的实例
2.第一个是单实例,很好理解,在加载配置文件的时候, ApplicationContext context = new ClassPathXmlApplicationContext(“spring/xxxx.xml”);
就可以生成实例对象了,因为不管怎么调,返回的都是这一个。
既然第二个是多的,就有一个问题,因为他不知道我要用几个,那他就不会提前就new出我想要的实例,那就是在调用时new XXXX xxx=
context.getBean(“xxx”,XXXX.class);
bean的生命周期(重要)
未完待续…