Spring目的:解决企业开发的复杂性。
两大重点:IOC和AOP
IOC:没学这个之前我们是主动自己去new对象,然后调里面的方法,有了spring之后。
就可以把我们的那个类,写成这样的一个bean,装入进去,这个id就是我们随便起的名字,以后调用就调用这个名字,后面的class是你那个类的一个全路径,相当于标记你这个类的具体位置,这样spring才能找到。
测试:1,先下载springBean的配置文件,就通过new这个applicationcontext这个,返回一个context,通过这个去get一个我们写的bean,就会返回一个具体我们编写类型的一个对象。直接调用即可。
使用spring这些依赖需要加上。
IOC实现解析:
IOC思想是基于IOC容器来完成的,IOC容器底层就是对象工厂。
Spring IOC 两种实现方式(两个接口):
1.BeanFactory:IOC容器实现,是spring内部使用的接口,不提供开发人员进行使用,这个方式加载spring配置文件时,不创建对象,当我们使用的时候才会去创建对象,就是getBean这步。
2.ApplicationContext:BeanFactory的一个子接口,加载配置文件的时候就会把配置文件里面的对象进行创建。
什么是bean管理?
1.创建对象
2.注入属性
bean管理操作有两种方式?
1.基于xml实现方式
这就是基于xml的一个对象创建。一个一个的bean即使一个对象。
注意点啊:这个bean对象创建走的也是构造器,所以你在编写类的时候,这个类里面要是声明了一些属性,你必须加构造器,有参,无参的,这样你这些属性才会有默认的初始值,不然就报错。
2.基于注解的实现方式
Bean的注入方式?
1.set注入
核心就是一定要有set方法,我们现在编写一个类测试下,声明两个属性。
可以看到,我们在没有为属性写set方法的时候,无法对属性进行一个注入
这就是通过set来对bean进行一个属性的注入。
2.使用有参。无参构造器进行注入
首先,我对这个类声明了两个属性,加了一个有参构造器,注意啊,加上有参,无参构造器如果你不主动创建,就没有无参构造器。
因为我们是通过有参构造器注入,所以这种时候,你没有无参也可以,但我们平时,可能不会这么特意的为了演示故意填值,所以我们在不通过构造器赋值的情况下,创建bean,无参是必须要加上的,不然bean对象无法创建。
第三种注入方式:p命名空间注入,这个需要在set注入的基础之上可以使用,必须有set方法,相当于对set注入里面的xml配置做一个简化
在spring中,在xml配置里面给属性写值,如果遇到特殊符号怎么办。如 <<上海>>这种的。 <![CDATA[<<上海>>]]>这种写法可以识别,ok
外部bean的xml注入方式
我现在想在UserService里面调用UserDao的实现类里面的方法,也就是UserDaoImpl里面的方法怎么做?怎么注入?
首先把UserService和UserDao这两个,注入到bean当中,去xml写。
我先是在UserService里面把UserDao引入进来,提供一个set方法。也就是通过set注入的方式引入外部bean。
然后这样就ok了。
一对多方式一:
部门类
public class Dept {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dept{" +
"name='" + name + '\'' +
'}';
}
员工类
public class Emp {
private String eName;
private String gender;
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void seteName(String eName) {
this.eName = eName;
}
public void setGender(String gender) {
this.gender = gender;
}
public void show(){
System.out.println(eName+"="+gender+"="+dept);
}
首先,一个部门可以有多个员工,每个员工都会有自己所属的部门,这样我们在员工类里面,把部门这个类引入进来,当部门的一个属性,本次使用的是set注入,set方法记得写。
然后把员工的bean写出来,但这个部门这个对象属性,怎么弄呢?我们可以在员工这个bean中的里面在内嵌一个bean,就是部门bean,里面的属性在里面进行一个赋值。
测试
第二种,一对多的方式:这个名字真是花里胡哨,叫级联赋值,真对这名字起的无语,看起来还以为多高端呢。啊这这这
这个就跟上面那个引入外部bean的方式一样,只不过在这个外部bean的里面设置了值而已。真挺无语。
测试
第二种写法:
在员工里面为部门生成一个get方法,这样就可以在员工的bean里面,可以通过部门对象,直接get到它里面的属性,然后就可以直接赋值。
花样属性的注入,list,set,map,数组
public class Stun {
private String name;
private List<String> course;
private Set<Integer> age;
private String[] info;
private Map<Integer,String> address;
public void setName(String name) {
this.name = name;
}
public void setCourse(List<String> course) {
this.course = course;
}
public void setAge(Set<Integer> age) {
this.age = age;
}
public void setInfo(String[] info) {
this.info = info;
}
public void setAddress(Map<Integer, String> address) {
this.address = address;
}
@Override
public String toString() {
return "Stun{" +
"name='" + name + '\'' +
", course=" + course +
", age=" + age +
", info=" + Arrays.toString(info) +
", address=" + address +
'}';
}
public void show(){
System.out.println(address);
System.out.println(info);
System.out.println(age);
System.out.println(course);
System.out.println(name);
}
然后去xml里面配置bean,其实这些类型看着不同,操作却很神似。
<?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="stun" class="com.bean.Stun">
<property name="name" value="小张"/>
<property name="address">
<map>
<entry key="1" value="无敌"/>
<entry key="2" value="上进"/>
<entry key="3" value="暴富"/>
</map>
</property>
<property name="age">
<set>
<value>10000</value>
<value>20000</value>
</set>
</property>
<property name="course">
<list>
<value>月薪过w</value>
<value>年薪过千万</value>
</list>
</property>
<property name="info">
<array>
<value>有钱</value>
<value>牛逼</value>
</array>
</property>
</bean>
</beans>
测试
对于属性为list集合里面的属性是对象的话如何去做?
一个学生会有多门课程,我们就把每一门课程在xml配置里面都列为一个个的bean,然后通过stu这个bean里面的这个list对象的属性的属性,进行一个引用在bean中即可。
util提取集合内容,作为一个公共部分。
spring有两种类型的Bean
1.普通的bean:就是我们在xml配置里面为每个类写的bean,这个返回值类型是固定的,我们定义什么类型,getbean的时候返回的就是什么类型。
2.工厂bean:这个和普通的bean的区别就是,返回值类型可以跟自己定义的不一样,使用方法,我们想改变的那个类,实现beanFactory,重写里面的方法,编写object类型的getbean方法即可,在里面new一个我们想要类型的bean。return返回出去即可。