Spring
导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.13</version>
</dependency>
优点
spring是一个开源的免费的框架(容器)
spring是一个轻量级的、非入侵式的框架
控制反转(IOC),面向切面编程(AOP)
支持事务的处理,对框架整合的支持
springboot
一个快速开发的脚手架
基于springboot可以快速的开发单个微服务
约定大于配置
springcloud
基于springboot实现的
弊端:发展了太久之后,违背了原来的理念,配置十分繁琐
IOC控制反转理论
IOC就是对象由spring创建管理
之前的业务中用户的需求 可能会影响我们原来的代码 因为我们需要根据用户的需求来修改代码 程序是主动创建对象,控制权在程序员手里
之后,我们使用一个Set接口实现 程序不再具有主动性,而是变成了被动的接受对象!
public class UserServiceImpl implements UserService{
private UserDao userDao ;
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,其实现方法是依赖注入
beans,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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用spring来创建对象-->
<bean id="hello" class="com.zxw.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
测试
public class MyTest {
public static void main(String[] args) {
//获取spring的上下文对象 ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //通过XML方式获取
//我们的对象现在都在spring容器中管理了,我们要使用,直接取出来就可以了
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
IOC创建对象的方式
1.默认使用无参构造器创建对象
2.若使用有参构造器创建对象 :可以使用如下
1.下标赋值
<!-- 下标赋值构造器-->
<bean id="hello" class="com.zxw.pojo.Hello">
<constructor-arg index="0" value="zxw"></constructor-arg>
</bean>
2.参数类型
不推荐使用 当有多个同类型的参数要传递时,无法分辨
<bean id="hello" class="com.zxw.pojo.Hello">
<constructor-arg type="java.lang.String" value="zxw"></constructor-arg>
<property name="str" value="Spring"/>
</bean>
3.参数名
<!-- 直接通过参数名创建-->
<bean id="hello" class="com.zxw.pojo.Hello">
<constructor-arg name="s" value="zxw"></constructor-arg>
</bean>
在配置文件加载的时候,容器中管理的对象就已经初始化了
Sprint配置
applicationContext.xml
alias 别名
配置别名后 通过别名也可获取到对象
<alias name="hello" alias="hello2"></alias>
bean的配置
id bean的唯一标识符 对象名
class bean 对象所对应的全限定名: 包名+类型
name 别名,name更高级 可以同时取多个别名 可用逗号空格分号分割
<bean id="hello" class="com.zxw.pojo.Hello" name="hello3,u2">
<constructor-arg name="s" value="zxw"></constructor-arg>
</bean>
import
一般用于团队开发使用,他可以将多个配置文Joan,导入合并为一个
在总的配置文件中导入子配置文件,导入后所有子配置文件中的配置 总配置文件都可用
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
<import resource="beans.xml"></import>
依赖注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入
1.构造器注入
见 IOC创建对象的方式
2.set方式注入 重点
依赖注入
环境搭建
1.复杂类型
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.真实测试对象
private String name;
private Address address;
private String[] books;
private List hobbys;
private Map<String,String> card;
private Set games;
private String wife;
private Properties info;
3.applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="student" class="com.zxw.pojo.Student">
<property name="name" value="张馨文"></property>
</bean>
<import resource="beans.xml"></import>
</beans>
4.测试
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.zxw.pojo.Address"></bean>
<bean id="student" class="com.zxw.pojo.Student">
<!-- 第一种注入 普通值注入 name value-->
<property name="name" value="张馨文"></property>
<!-- 第二种注入 bean注入 name ref-->
<property name="address" ref="address"></property>
<!-- 数组注入 -->
<property name="books">
<array >
<value>红楼梦</value>
<value>西游记</value>
<value>三国演义</value>
</array>
</property>
<!-- list注入-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>写代码</value>
</list>
</property>
<!-- map注入-->
<property name="card">
<map>
<entry key="身份证" value="1111111111111111111"></entry>
<entry key="银行卡" value="22222222222222222"></entry>
</map>
</property>
<!-- set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!-- null值注入-->
<!-- <property name="wife" value=""/>-->
<property name="wife">
<null/>
</property>
<!-- properties注入-->
<property name="info">
<props>
<prop key="学好">202009070155</prop>
<prop key="性别">男</prop>
</props>
</property>
</bean>
<import resource="beans.xml"></import>
</beans>
3.拓展方式注入
p命名空间注入,可以直接注入属性的值:property
xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.zxw.pojo.Hello" p:str="zxw">
</bean>
c命名空间注入通过构造器注入 constructor
xmlns:c="http://www.springframework.org/schema/c"
<bean id="user" class="com.zxw.pojo.Hello" p:str="zxw" c:s="zxw">
</bean>
注意点 p命名和c命名不能直接使用,需要导入xml约束