##学习需要掌握:反射和最简单的MVC架构流程
##对spring有过基础性的理论知识
##按照代码一步步来,30分钟掌握Spring的基本使用
1:先用spring创建一个最简单的对象
首先创建一个对象 package com.itmayiedu.entity; public class UserEntity { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
创建spring的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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 根据id userentity <bean id="userEntity" class="com.itmayiedu.entity.UserEntity" /> </beans>
##根据spring创建文件 package com.itmayiedu.entity.controller; import com.itmayiedu.entity.UserEntity; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("spring.xml"); UserEntity userEntity = (UserEntity) application.getBean("userEntity"); System.out.println(userEntity); } }
2:关于spring的单例等问题
首先如何证明spring单例的
package com.itmayiedu.entity; public class UserEntity { private String name; private Integer age; public UserEntity() { System.out.println("我创建了一个对象"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
## 如果地址相同则证明是同一个对象,spring是单例的,package com.itmayiedu.entity.controller; import com.itmayiedu.entity.UserEntity; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("spring.xml"); UserEntity userEntity = (UserEntity) application.getBean("userEntity"); UserEntity userEntity1 = (UserEntity) application.getBean("userEntity"); System.out.println(userEntity==userEntity1); System.out.println(userEntity); } ## 输出结果:true }
那么尽然spring是单例(在加载容器的时候便会初始化)如何变成多例的了(也就是更改作用域)?
<!-- prototype --> <bean id="userEntity" class="com.itmayiedu.entity.UserEntity" scope="prototype"/>
springioc创建对象的方式有哪些
构造函数
工厂创建对象
工厂类 静态工厂
工厂内 非静态工厂
想说一个根据构造函数来创建对象
无参函数刚刚已经说过那,这里主要说一下有参函数,在实体类中我们需要给给他声明一个有参函数
<!-- 无参构造函数 --> <bean id="user1" class="com.itmayiedu.entity.UserEntity" scope="prototype" /> <!-- 有参构造函数 --> <bean id="user2" class="com.itmayiedu.entity.UserEntity"> <constructor-arg name="name" type="java.lang.String" value="张三"></constructor-arg> <constructor-arg name="age" type="java.lang.Integer" value="18"></constructor-arg> </bean>
这里可以看到无参构造函数的优先于午参构造函数的
首先我们创建一个工厂类
package com.itmayiedu.entity; import javax.swing.text.html.parser.Entity; public class ObjectFactory { public UserEntity getInstance(){ System.out.println(); return new UserEntity("wwww",23); } public static UserEntity getStaticInstance(){ System.out.println(); return new UserEntity("ggg",66); } }
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 无参构造函数 --> <bean id="user1" class="com.itmayiedu.entity.UserEntity" scope="prototype" /> <!-- 有参构造函数 --> <bean id="user2" class="com.itmayiedu.entity.UserEntity"> <constructor-arg name="name" type="java.lang.String" value="张三"></constructor-arg> <constructor-arg name="age" type="java.lang.Integer" value="18"></constructor-arg> </bean> <bean id="factory" class="com.itmayiedu.entity.ObjectFactory"></bean> <!-- 通过实例工厂方法创建 --> <bean id="user3" factory-bean="factory" factory-method="getInstance"></bean> <!-- 通过静态工厂方法创建 --> <bean id="user4" class="com.itmayiedu.entity.ObjectFactory" factory-method="getStaticInstance"></bean> </beans>
接下来讲讲spring的注入
注入的方式
通过构造函数(上面已经演示过)
通过set方法给对象赋值
p名称空间
自动装配
注解
在这里讲解set方法的注入
### 曾经迪士尼面试官问过一道题,在spring中加入A依赖B 如何进行注入, 当时特别简单的一道题,结果想歪啦.说什么A的实体类有一个B对象进行new,接下来进行正解
这样的话,就完成了抵赖注入.
那么很多人很好奇问啦.为什么叫setter注入.没setter为什么就不行了.其实他底层用了反射setter方法修改属性办法,详情可以看我的过去的博客
https://www.cnblogs.com/itcastwzp/p/10971746.html
P标签注入
<bean id="userService" class="cn.itmayiedu.UserAction" p:userService-ref="userDao"></bean>
这种方式恨简单.但是用的人很少,作为了解就好
Spring注解
如果想使用spring的注解,我们需要在xml中开启注解的权限并且扫描注的范围
<context:component-scan base-package="com.cloudwalk"></context:component-scan>
@Respsitory 他的作用 类似 用于数据层
@Sevice 服务层
@Controller 控制层
作用类似
<bean id="factory" class="com.itmayiedu.entity.ObjectFactory"></bean>
@Autowired类似
<property name="userDao" ref="userDao"></property>
Spring的AOP
aop可以类似看重复的代码看成切面然后直接引用
首先xml开启aop
<!--开启AOP注解--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Component @Aspect public class Aop { /** 执行方法执行前**/ @Before("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void begin(){ System.out.println("开启事务"); } /**执行方法执行后**/ @After("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void commit(){ System.out.println("事务提交"); } /**执行方法抛异常**/ @AfterThrowing("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void error(){ System.out.println("啊,我有异常啦"); } /**方法运行结束后**/ @AfterReturning("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void run(){ System.out.println("运行"); } }
然后直接调用即可
这里难点和重点需要学习的是spring aop的表达式的写法 也就是这写aop执行在那些地方有效
具体参考https://www.cnblogs.com/imzhuo/p/5888007.html这位大佬的博客
下面详解如何xml配置aop
首先取消@aspect注解
配置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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.itmayiedu"></context:component-scan> <!-- 把切面类注入到容器中--> <bean id="aop" class="com.itmayiedu.entity.controller.Aop"> </bean> <aop:config> <!-- 书写spring aop 拦截表达式--> <aop:pointcut id="pf" expression="execution(* com.itmayiedu.entity.controller.UserService.add(..))"></aop:pointcut> <!-- 标记一个且表--> <aop:aspect ref="aop"> <!-- 用什么通知,通知用哪个拦截表达式--> <aop:before method="begin" pointcut-ref="pf"></aop:before> <aop:after method="commit" pointcut-ref="pf"></aop:after> </aop:aspect> </aop:config> </beans>
运行结果
原文地址:https://www.cnblogs.com/itcastwzp/p/10989649.html