Spring 是轻量级的开源的 JavaEE 框架
解决企业应用开发的复杂性
核心部分:IOC 和 Aop
Spring 特点
方便解耦,简化开发
Spring模块
控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
耦合度降低
xml解析 工厂模式 反射
IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
Spring 提供 IOC 容器实现两种方式:(两个接口)
Spring 创建对象 + Spirng 注入属性
操作方式:
spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
xml 方式注入属性:依赖注入DI,创建对象的注入属性
<!-- set 方法注入属性-->
<bean id="user" class="com.fremont.spring.User">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
</bean>
<!--有参数构造注入属性-->
<bean id="orders" class="com.atguigu.spring5.Orders">
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
p名称空间注入:简化基于 xml 配置方式
添加 p 名称空间在配置文件中
<bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功"
p:bauthor="无名氏"></bean>
1、字面量
<!--null 值-->
<property name="address">
<null/>
</property>
<!--属性值包含特殊符号
1 把<>进行转义 < >
2 把带特殊符号内容写到 CDATA-->
<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>
2、注入属性-外部 bean
service 调用 dao 里面的方法
<!--service 和 dao 对象创建-->
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.atguigu.spring5.service.UserService">
<!--注入 userDao 对象
name 属性:类里面属性名称
ref 属性:创建 userDao 对象 bean 标签 id 值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
3、注入属性-内部 bean
对象类型属性
<!--外部 bean-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!--设置对象类型属性,内部bean-->
<property name="dept">
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="安保部"></property>
</bean>
</property>
</bean>
4、注入属性-级联赋值
<!--1-级联赋值-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
<!--2-级联赋值-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="技术部"></property>
</bean>
5、注入集合
生成对应set方法
<!--1 集合类型属性注入-->
<bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
<!--数组类型属性注入-->
<property name="courses">
<array>
<value>java 课程</value>
<value>数据库课程</value>
</array>
</property>
<!--list 类型属性注入-->
<property name="list">
<list>
<value>张三</value>
<value>小三</value>
</list>
</property>
<!--map 类型属性注入-->
<property name="maps">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="PHP" value="php"></entry>
</map>
</property>
<!--set 类型属性注入-->
<property name="sets">
<set>
<value>MySQL</value>
<value>Redis</value>
</set>
</property>
</bean>
集合里面设置对象类型值
<!--创建多个 course 对象-->
<bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="Spring5 框架"></property>
</bean>
<bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="MyBatis 框架"></property>
</bean>
<!--注入 list 集合类型,值是对象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
提取集合注入部分:引入名称空间 util
xmlns:util="http://www.springframework.org/schema/util"
<!--1 提取 list 集合类型属性注入-->
<util:list id="bookList">
<value>易筋经</value>
<value>九阴真经</value>
<value>九阳神功</value>
</util:list>
<!--2 提取 list 集合类型属性注入使用-->
<bean id="book" class="com.atguigu.spring5.collectiontype.Book">
<property name="list" ref="bookList"></property>
</bean>
操作Bean:
普通Bean:中定义 bean 类型就是返回类型
工厂Bean:定义 bean 类型可以和返回类型不一样
Bean作用域:bean 标签里面有属性(scope)用于设置单实例还是多实例
Bean生命周期:从创建到销毁
Bean 的后置处理器:初始化前后处理实例
创建后置处理器 MyBeanPost,实现接口 BeanPostProcessor
配置后置处理器:
xml自动装配:指定装配规则
<!--实现自动装配
bean 标签属性 autowire,配置自动装配
autowire 属性常用两个值:
byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
byType 根据属性类型注入
-->
<bean id="emp" class="com.spring5.autowire.Emp" autowire="byName"></bean>
<bean id="dept" class="com.spring5.autowire.Dept"></bean>
外部属性文件:
先建立 jdbc.properties
引入 context 名称空间
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation中加入:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!-- 配置 Druid 连接池 -->
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver");
set方法注入
-->
<!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
<property name="driverClassName" value="${jdbc.driverclass}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
注解作用在类上面,方法上面,属性上面;简化 xml 配置
引入依赖:spring-aop-5.2.6.RELEASE.JAR
开启组件扫描:
<!--先添加
xmlns:context="http://www.springframework.org/schema/context"
在xsi:schemaLocation中添加:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
-->
<!--开启组件扫描
1 如果扫描多个包,多个包使用逗号隔开
2 扫描包上层目录
-->
<!--use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter-->
<context:component-scan base-package="com.atguigu,com.xxx"
use-default-filters="false">
<!--context:include-filter ,设置扫描哪些内容-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!--context:exclude-filter: 设置哪些内容不进行扫描-->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Component"/>
</context:component-scan>
添加创建对象注解
创建对象、创建 bean 实例提供注解 :
@Component @Service @Controller @Repository
注解方式实现属性注入
完全注解开发
创建配置类,替代 xml 配置文件
@Configuration//作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.fremont"})
public class SpringConfig {
}
//在测试中加载
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
原文:https://www.cnblogs.com/fremontxutheultimate/p/14801511.html