Spring
1、第一天
1.Spring是一个开源框架,主要优势之一是其分层架构,分层架构允许使用者选择使用哪一个组件. Spring的核心是IOC(控制反转)和AOP(面向切面)。 2.IOC:创建类的对象的时候,使用ioc实现对象创建,通过配置文件方式创建对象。 底层原理技术:xml配置文件;dom4j解析xml文件;工厂模式;反射 AOP:不通过修改源代码方式增强类里面的方法。 3.spring框架需要的包:beans;core;context;SpEL;commons-logging-1.2; log4j-1.2.16; 4.配置文件:bean.xml 放到src下。 约束内容:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
5.Spring的Bean管理: (1)创建对象(bean实例化) (2)设置类里面属性值 6.类的实例化: (1)使用类的无参构造:
<bean id="user" class="com.edu.nuc.ioc.User"></bean>
(2)使用静态工厂创建:
<bean id="userByFactory_1" class="com.edu.nuc.factory.Bean2Factory_1" factory-method="getUser"></bean>
(3)使用实例工厂创建
<bean id="userByFactory_2" class="com.edu.nuc.factory.Bean2Factory_2"></bean>
<bean id="user_2" factory-bean="userByFactory_2" factory-method="getUser"></bean>
7.scope属性 id属性:根据id属性值获取对象; 在一个spring配置文件中,可以有多个bean标签,但是bean标签id属性值不同 class属性类的全路径 scope属性 (1)主要作用:配置创建对象是单实例还是多实例对象 (2)属性值: 默认值,singleton,表示单实例对象; prototype,表示多实例对象; action是多实例对象 request:把创建对象放到request里面 session:把创建对象放到session里面 globalSession:把创建对象放到globalSession里面 8.属性注入: (1)使用有参构造注入
<bean id="book" class="cn.itcast.attr.Book">
<constructor-arg name="bname" value="易筋经"></constructor-arg>
<constructor-arg name="author" value="小王"></constructor-arg>
</bean>
(2)使用Set方法注入:
<bean id="orders" class="cn.itcast.attr.Orders">
<property name="oname" value="洗髓经"></property>
<property name="oaddress" value="嵩山"></property>
</bean>
(3)注入对象类型属性:
<!-- 注入对象类型属性-->
<bean id="userDaoImpl" class="cn.itcast.attr.UserDao"></bean>
<bean id="userService" class="cn.itcast.attr.UserService">
<!-- 如果注入普通类型属性 使用value属性 ,如果注入对象类型属性,使用ref属性
name: 类里面的属性名称
ref:dao对象所在标签id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
9.Test方法;
@Test
public void testUserDao() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserDao dao = context.getBean("userDao",UserDao.class);
dao.add();
context.close();
}
二、第二天
Spring 1 spring分模块配置开发 (1)加载配置文件的时候,加载多个。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml","bean2.xml");
(2)在配置文件中一如其它配置文件
<import resource="classpath:bean2.xml"/>
2 注入复杂类型属性(会用)
<!-- 注入复杂类型属性 -->
<bean id="customer" class="com.edu.nuc.bean.Customer">
<!-- 数组 -->
<property name="arr">
<list>
<value>欧阳娜娜</value> <value>沈月</value> <value>刘惜君</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>张三丰</value> <value>李小龙</value> <value>乔峰</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="体育" value="足球"> </entry><entry key="体育" value="篮球"></entry>
</map>
</property>
<!-- properties -->
<property name="proper">
<props>
<prop key="driver">com.mysql.jdbs.Driver</prop> <prop key="url">jdbc:mysql://localhost:3306/db</prop>
</props>
</property>
</bean>
3 spring的bean管理(注解)(重点) 使用注解方式实现创建对象和注入属性 什么是注解? (1)注解代码中特殊标记 (2)写法: @注解名称(属性名称1=属性值1, 属性名称2=属性值2) (3)注解可以使用类上面、使用方法上面、使用在属性上面 (4)为什么使用注解:替代配置文件实现一部分功能,简化配置 3.1jar包
3.2配置文件
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 开启注解扫描 该包下的所有注解都可以扫描到 -->
<context:component-scan base-package="com.edu.nuc.bean"></context:component-scan>
<context:component-scan base-package="com.edu.nuc.test"></context:component-scan>
</beans>
3.3Spring注解创建对象 与@component功能相同的注解: //value可以省略 @Controller :WEB层 @Service:业务层 @Repository:持久层 例子: (1) bean包下:
@Component("User") //创建实例对象
//@Scope(value="prototype") 单例和多例设置
public class User {
@Value("刘惜君") //赋值
private String name;
@Value("18")
private int age;
public void test() {
System.out.println("努力努力再努力");
System.out.println("我喜欢"+this.name+",她今年 "+this.age+"岁了");
}
}
Test包:
@Test
public void test_1() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("User",User.class);
user.test();
context.close();
}
(2)对象类型属性
@Component("People")
public class People {
@Autowired
private User user;
}
@Test
public void test_2() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
People p = context.getBean("People",People.class);
System.out.println(p.toString());
context.close();
}
3.4配置文件和注解混合使用 创建对象使用配置文件 注入属性使用注解 4 AOP概念和原理 4.1 aop概述:Aspect Oriented Programming面向切面(方面)编程,不通过修改源代码方式实现功能扩展 aop底层原理:横向抽取机制,动态代理实现 4.2aop操作相关术语 切入点:实际增强的方法 增强/通知;增强一个类里面的方法,写增强的逻辑称为 通知/通知 切面:在方法上面写增强逻辑,应用到切入点的过程。 4.3:通知类型 前置通知:<aop:before> 后置通知:<aop:sfter-returning> 环绕通知:<aop:around> 异常通知:<aop:after-throwing> 最终通知:<aop:after> 4.5 AOpjar包
4.6使用表达式配置切入点:
execution(* cn.itcast.UserDao.update(..)) //增强该方法
execution(* cn.itcast.UserDao.*(..)) //增强该类的所有方法
execution(* *.*(..)) //增强所有
4.7实例:
bean.xml:
<beans>
<bean id= "user" class="com.edu.nuc.bean.User"></bean>
<bean id= "myUser" class="com.edu.nuc.bean.MyUser"></bean>
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.edu.nuc.bean.User.test(..))" id="p1"/>
<!-- 配置切面 -->
<aop:aspect ref="myUser" >
<aop:before method="before" pointcut-ref="p1"/>
<aop:around method="round" pointcut-ref="p1"/>
</aop:aspect> </aop:config>
</beans>
原来的类:
public class User {
public void test() {
System.out.println("努力努力再努力");
}
}
增强类:
public class MyUser {
public void before() {
System.out.println("我们的口号是什么:");
}
//环绕需要这样写
public void round(ProceedingJoinPoint p) throws Throwable {
System.out.println("环绕前");
p.proceed();
System.out.println("环绕后");
}
}
Test方法:
public class TestDemo {
@Test
public void test_1() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user",User.class);
user.test();
}
}
结果: