目录
Spring的设计理念
Spring是面向Bean的编程
Spring 两大核心技术
控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection ) :是面向对象编程的一种设计理念,用来降低程序代码之间的耦合度,将创建对象的控制权交给容器
面向切面编程(AOP:Aspect Oriented Programming): 在不影响原有代码的情况下,添加(扩展)新的功能
spring的优点
1.低侵入式设计
2.独立于各种应用服务器
3.依赖注入特性将组件关系透明化,降低了耦合度
4.面向切面编程特性允许将通用任务进行集中式处理
5.与第三方框架的良好整合
=================================================================
设值的方式
<bean id="user" class="cn.bdqn.printer.user">
<property name="name" class="张三"></property>
<property name="age" ref="19"></property>
<property name="ink" ref="colorInk"></property>
<property name="paper" ref="a4Paper"></property>
</bean>
P命名空间设值
使用前要先要在Spring配置文件中引入p命名空间
xmlns:p="http://www.springframework.org/schema/p"
例:
<bean id="user" class="entity.User" p:age="23" p:username="张三" p:email="zhangsan@xxx.com" />
<bean id="userService" class="service.impl.UserServiceImpl" p:dao-ref="userDao" />
使用构造参数设值
<bean name="User" class="sping_day02.Demo3.User">
<constructor-arg value="张三" index="0"></constructor-arg>
<constructor-arg value="三天不打弟弟东,手痒痒" index="1"></constructor-arg>
</bean>
注入不同的值
//注入特殊字符串1
<property name="string1">
<value>萨达&</value>
</property>
//注入特殊字符串2
<property name="string2">
<value>dadasdas</value>
</property>
//注入实体
<property name="user">
<bean class="sping_day02.Demo2.pojo.User">
<property name="name" value="张三"></property>
<property name="speak" value="撒大大"></property>
</bean>
</property>
//注入list集合
<property name="list">
<list>
<value>弟弟东1</value>
<value>弟弟东2</value>
<value>弟弟东3</value>
</list>
</property>
//注入数组
<property name="array">
<array>
<value>啊山1</value>
<value>啊山2</value>
<value>啊山3</value>
</array>
</property>
//注入set集合
<property name="set">
<set>
<value>博龙1</value>
<value>博龙2</value>
<value>博龙3</value>
</set>
</property>
//注入map
<property name="map">
<map>
<entry>
<key><value>222</value></key>
<value>adahk</value>
</entry>
<entry>
<key><value>3333</value></key>
<value>sfadsfs</value>
</entry>
</map>
</property>
//注入Properties属性
<property name="prop">
<props>
<prop key="dasd">撒大大</prop>
<prop key="fdxcs">dsfssd</prop>
</props>
</property>
//注入空值
<property name="emptyValue">
<value></value>
</property>
//注入null值
<property name="nullValue">
<null></null>
</property>
==============================================================================
spring配置
IOC配置
// scope bean的作用域 singleton 单例 prototype 多例
// init-method 初始化方法
// destroy-method 销毁方法
<bean id="user" class="cn.bdqn.printer.user" scope="singleton" init-method="ini" destroy-method="destroy">
<property name="name" class="张三"></property>
<property name="age" ref="19"></property>
<property name="ink" ref="colorInk"></property>
<property name="paper" ref="a4Paper"></property>
</bean>
AOP配置
<!--配置aop-->
<!--声明增强方法所在的类-->
<bean id="Logger" class="sping_day02.aop.service.UserServiceLogger"></bean>
<!--配置切面-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="add" expression="execution(* sping_day02.aop.service.*.*(..))"/>
<!--引入增强方法-->
<aop:aspect ref="Logger">
<!--前置增强 method:调用增强类里面的哪个方法 pointcut-ref:要增强的类-->
<aop:before method="before" pointcut-ref="add"></aop:before>
<!--后置增强 returning:返回值-->
<aop:after-returning method="afterReturning" pointcut-ref="add" returning="result"></aop:after-returning>
<!--异常增强 throwing:异常-->
<aop:after-throwing method="errorLogger" pointcut-ref="add" throwing="e"></aop:after-throwing>
<!--最终增强-->
<aop:after method="after" pointcut-ref="add"></aop:after>
<!--环绕增强-->
<aop:around method="aroundLogger" pointcut-ref="add"></aop:around>
</aop:aspect>
</aop:config>
==============================================================================
spring注入
1.setter注入
<bean name="userDao" class="sping_day02.Demo2.dao.UserDaoImpl"></bean>
<bean name="userService" ref="userDao"></bean>
UserService userService;
public void setUserService(UserService userService){
this.userService = userService;
}
2.构造器注入
<bean name="UserDao" class="sping_day02.Demo2.dao.UserDaoImpl"></bean>
<bean name="UserService" class="sping_day02.Demo2.service.UserServiceImpl">
<constructor-arg ref="UserDao"></constructor-arg>
</bean>
UserDao userDao = null;
public UserServiceImpl(UserDao userDao) {
System.out.println("进入构造");
this.userDao = userDao;
}
3.注解注入
IOC注解
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" ****
xsi:schemaLocation="......
http://www.springframework.org/schema/context ****
http://www.springframework.org/schema/context/spring-context-3.2.xsd"> ****
<!-- 扫描包中注解标注的类 -->
<context:component-scan base-package="service,dao" /> ****
</beans>
@Component Bean组件的定义
@Repository Dao层
@Service Service层
@Controller 控制层
@Autowired 实现Bean的自动装配,默认按类型匹配
@Qualifier(“userDao”) 指定Bean的名称,同上
public void setDao((@Qualifier(“userDao”) UserDao dao) 也可以对方法的入参进行标注
JAVA的注解
@Resoirce 实现Bean的自动装配,默认按类型匹配
注:需要在xml中配置扫描包中注解标注的类
============================================================================
AOP注解
@Aspect 定义切面
@Pointcut 设置切入点
@Before 前置增强
@AfterReturning 后置增强
@AfterThrowing 异常增强
@After 最终增强
@Around 环绕增强
<!--配置扫描-->
<context:component-scan base-package="sping_day03.Demo2"></context:component-scan>
<!--配置切面-->
<bean class="sping_day03.Demo2.dao.UserServiceLogger"></bean>
<!--开启AOP注解-->
<aop:aspectj-autoproxy/>