image-20250417152319400

给分成了三层,后面的mapper就是mybatis的,如果要获取其他对象就需要在这里面创建类,比如BookService2 b = new BookService2这样,但只要一改名字,就需要把所有的对象名字都改,这样耦合度太高。就需要用到spring容器来进行统一管理

ioc就是控制反转的意思,把创建对象的权利交给spring容器

image-20250417154946468

会有一个配置文件叫applicationcontext.xml,里面存放了bean这个,id就是名字,class是类型,然后他自动通过反射机制创建对象,然后放到spring容器里,这个容器可以理解成一个筐,苹果放一个筐梨放一个筐,然后再从这个容器里读取到java程序

image-20250417163056544

image-20250417162954540

image-20250417191936410

1
2
3
4
<bean id = "b" class = 'com.msb.pojo.Book'>
<property name="id" value="1"></property>
<property name="name" value="项目驱动零起点"></property>
</bean>

如果对应的set方法里是setId1,那么上面的name=id就要改成id1,只跟这个set方法有关,跟属性名无关

1
2
3
public void setId1(int id){
this.id = id;
}

构造注入

1
2
3
4
<bean id = "b2" class = 'com.msb.pojo.Book'>
<constructor-arg name="id2" value="1"></constructor-arg>
<constructor-arg name="name2" value="项目驱动零起点"></constructor-arg>
</bean>

这里的id名就和构造方法里的参数有关了

1
2
3
4
public Book(int id2, String name2){
this.id=id2;
this.name=name2;
}

Spring属性注入的方式:

设置属性的值:

方式一:value:简单数据类型(基本数据类型+String)直接设置;

方式二:ref:需要引用另一个bean的id,也就是说这个参数是一个类类型,且这个类的对象也被spring容器管理

1
2
3
4
5
6
7
8
9
<bean id = "boy" class = 'com.msb.pojo.Book'>
<property name="age" value="22"></property>
<property name="name" value="小明"></property>
</bean>
<bean id = "girl" class = 'com.msb.pojo.Book'>
<property name="age" value="19"></property>
<property name="name" value="露露"></property>
<property name="boyfriend" ref="boy"></property>//这里要注意
</bean>
1
2
3
4
5
6
7
8
9
public class Test3{
public static void main(String[] args){
//创建spring容器
ApplicationContext context = new ClassPathXmlApplicationContest("application.xml");
//获取对象,后面是ben取的名字,前面是一个具体的女孩Girl
Girl g = (Girl)context.getBean("girl");
System.out.println(""))
}
}

注解的引入:

image-20250418013350961

前面的几个都是一样的作用,分别用于不同的层,这样可以区分,直接写@Component也可以

@Component

在要创建对象的类中加入@Component注解,对象名字默认为:类名首字母变小写
注解要在哪个包下?要想找到这些注解,需要将注解所在的包进行扫描:设置需要扫描的包,并且需要在applicationContext.xml中添加context命名空间
加到某个类上,他识别到就自动创建具体的对象

image-20250418014003535

1
2
3
4
5
6
xmlns:context="http://www.springframework.org/schema/context"
xsi:scheamLocation="
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"

<context:component-scan base-package="com.msb.pojo"></context:component-scan>#这个包名要和自己的对应,这就是要扫描的包

@value

image-20250418015049329

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Conponent
public class Girl{
@Value("18")//可以直接给age复制,并且调用时不需要set方法
private int age;
@Value("丽丽")
private String name;
@Autowired//会把boy的值自动注入到这里面来
private Boy boyfriend;
}

@Conponent
public class Boy{
@Value("21")
private int age;
}