`
nnwq
  • 浏览: 208934 次
社区版块
存档分类
最新评论

Spring经典总结<2>

 
阅读更多

5.各种类型数据的注入

  1)基本数据注入

     利用value属性指定,可以注入字符串,数值等简单数据。

  *2)Bean对象注入

     利用ref属性指定,可以注入一个Bean组件对象

<bean id="hibernateCostDao" class="com.tarena.dao.HibernateCostDAO">

</bean>

<!-- setter方式注入示例 -->

<bean id="costAction" scope="prototype" 

       class="com.tarena.action.CostAction">

<!-- 将ref指定的id属性Bean对象给costDao属性注入 -->

<property name="costDao" ref="hibernateCostDao">

</property>

    </bean>

  3)集合数据注入

  eg:

applicationContext.xml配置如下:

<bean id="msgBean" scope="singleton" 

class="com.tarena.service.MessageBean">

<!-- 基本数据注入 -->

<property name="name" value="露丝">

</property>

<!-- 其中,value值的类型全部为String型,对于age属性来说,其类型为Int

型,在属性注入时Spring会自动进行类型转换(String—>int)

 -->

<property name="age" value="18">

</property>

<!-- List集合注入 -->

<property name="friends">

<list>

<value>TOM</value>

<value>JACK</value>

<value>张三丰</value>

</list>

</property>

<!-- Set集合注入 -->

<property name="cities">

<set>

<value>北京</value>

<value>上海</value>

<value>深圳</value>

</set>

</property>

<property name="includeTypes" value="jpeg,gif,jpg">

</property>

<!-- Map集合注入 -->

<property name="books">

<map>

<entry key="1001" value="Core Java基础"></entry>

<entry key="1002" value="Struts框架详解"></entry>

<entry key="1003" value="编程之美"></entry>

</map>Spring经典总结

</property>

<!-- Properties(本质是Map)属性注入 -->

<property name="dbParams">

<props>

<prop key="username">root</prop>

<prop key="password">1234</prop>

</props>

</property>

</bean>

测试类代码:

public class MessageBean {

private String name;

private int age;

private List<String> friends;

private Set<String> cities;

private Set<String> types;

private Map<Integer, String> books;

private Properties dbParams;

 

public void setDbParams(Properties dbParams) {

this.dbParams = dbParams;

}

 Spring经典总结

public void setIncludeTypes(String str) {

String[] arr = str.split(",");

types = new HashSet<String>();

for (String type : arr) {

types.add(type);

}

}

 

public void setCities(Set<String> cities) {

this.cities = cities;

}

 

public void setFriends(List<String> friends) {

this.friends = friends;

}

 

public void show() {

/**基本数据注入测试*/

System.out.println("姓名:" + name);

System.out.println("年龄:" + age);

/**List注入测试*/

System.out.println("---她的朋友---");

for (String s : friends) {

System.out.println(s);

}

/**Set集合注入测试*/

System.out.println("---他们所在城市---");

for (String s : cities) {

System.out.println(s);

}

System.out.println("---允许上传的图片类型---");

for (String s : types) {

System.out.println(s);

}

/**Map集合注入测试*/

System.out.println("-----图书信息-----");

Set<Integer> keys = books.keySet();

for (Integer key : keys) {

System.out.println("编号:" + key + " 名字:" + books.get(key));

}

/**Properties注入测试*/

System.out.println("----连接参数-----");

Set<Object> dbKeys = dbParams.keySet();

for (Object key : dbKeys) {

System.out.println(key + ":" + dbParams.getProperty(key.toString()));

}

}

public void setAge(int age) {

this.age = age;

}

public void setName(String name) {

this.name = name;

}

public void setBooks(Map<Integer, String> books) {

this.books = books;

}

}

*6.什么是AOP,解决什么问题

     Aspect Oriented Programming 面向方面编程也叫面向切面编程

面向方面编程是以(OOP)面向对象编程为基础,这两种编程思想侧重点不同。OOP侧重于对象,根据需求提炼出对象结构。AOP侧重于方面对象,方面(共同处理组件)关注的是共通处理部分,例如事务管理,权限控制,日志记录等。可以通过配置将其作用到某一个或多个目标对象上。好处是实现组件重复利用,改善程序结构,提高灵活性。将共同处理组件与目标对象解耦。

   AOP主要是解决一对多调用问题,一个共通组件被多个目标组件调用,降低组件关联。

*7.Spring容器AOP的基本使用

 1)引入spring-aop开发包

 2)编写方面组件,封装共通的处理逻辑

 3)在spring配置文件中,定义方面组件,利用aop配置,将方面组件方

    法和目标组件方法作用在一起。

8. AOP相关概念

    *1)方面(Aspect)

        方面(组件)指的是共同业务处理,可以切入到(即作用到)多个目标

        对象,可以多次使用。

    *2)切入点(Pointcut)

        切入点是连接点(Pintcut)的集合,采用表达式指定,用于指定哪些

        组件和方法作为方面组件的切入目标。

*1)方法限定表达式

   可以规定哪些方法被切入方面组件,哪些不被切入,也就是

   定义目标对象,格式如下:

execution(修饰符? 返回类型 方法名(参数) throws异常? )

   示例1:匹配容器中Bean对象的find开始的方法

           execution(* find*(..))

第一个“*”表示返回类型不限,"find*"表示以“find

”开头的所有方法,".."表示一个或多个参数(也即参

数不限)

   示例2:匹配CostServiceImpl类中所有方法

      execution(* tarena.service.CostServiceImpl.*(..))

   示例3:匹配tarena.service包下所有类的所有方法

    execution(* tarena.service.*.*(..))

   示例4:匹配tarena.service包及其子包下所有类所有方法

    execution(* tarena.service..*.*(..))

   示例5:匹配容器Bean对象中的find开始的方法,并且是 public void 修饰的

     execution(public void find*(..))

   *2.类型限定表达式

     可以规定哪个类中的所有方法被切入方面组件

  格式:within(包名.类型名)

    示例1:匹配CostServiceImpl类中所有方法

     within(tarena.service.CostServiceImpl)

    示例2:匹配tarena.service包下所有类所有方法

       within(tarena.service.*)

    示例3:匹配tarena.service包及其子包中所有类所有方法

       within(tarena.service..*)

   3.Bean的Id或Name名称限定

     可以按<bean>定义时,id或name属性值匹配  

      bean(beanIdOrName)

      示例1:匹配容器中id=costService的Bean对象

          bean(costService)

    示例2:匹配容器中id值以Service结尾的对象

        bean(*Service)

   4.参数类型限定

     args(参数类型列表)

     示例1:匹配有且只有一个参数,参数类型符合

               Serializable类型的方法

       args(java.io.Serializable)

   *注意:上述切入点表达式可以联合使用,采用&&,||连接

     3)连接点(JoinPoint)

       // 连接点的集合组成切入点,连接点指的是切面组件在目标对象上 // 作用的位置,例如:在方法调用前、方法调用后、或者发生异常。

       切入点是连接点的集合。代表方面组件和某一个目标方法的关联点。

    *4)通知(Advice)

        用于指定方面组件作用于目标对象中的目标方法的时机。例如前置

        通知,意思是先执行方面组件,再执行目标方法。

 Spring提供了5种类型的通知。用于指定方面组件在目标方法哪个

 位置切入。Spring经典总结

   a.前置通知 <aop:before>

      先执行方面组件,再执行目标组件方法

   b.后置通知 <aop:after-returning>

      先执行目标组件方法,没有异常再执行方面组件。

      如果发生异常,不会执行方面组件

   c.异常通知 <aop:after-throwing>

      当目标方法抛出异常之后,执行方面组件。

   d.最终通知 <aop:after>

      先执行目标方法,无论有没有异常都执行方面组件

   e.环绕通知 <aop:around>

      相当于前置+后置通知。在目标方法前和后都执行方面组件

   内部实现原理:

try{

     //前置通知切入

  //环绕前置通知切入

     //目标组件方法

  //环绕后置通知切入

     //后置通知切入

   }catch(){

    //异常通知切入

   }finally{

     //最终通知切入

   }

     5)目标对象(Target)

        方面组件作用的对象,即与切入点表达式匹配的对象。

     6)动态代理(AutoProxy)

       Spring采用了动态代理技术实现了AOP控制

       如果Spring采用了AOP配置后,容器getBean方法返回的组件对象

      是代理对象(一个动态生成类型,即动态代理类),用户在使用时,由

       代理对象调用切面组件和目标对象的功能。

     Spring采用的动态代理技术有以下两种:

      a.目标对象没有接口(使用cglib.jar工具包)

      适用于目标组件没有接口实现的情况。

 public class $Service$$Enhancer$CGLIB extends

 原目标组件类型{

    //重写目标对象的方法,在重写的方法中调用目标对象和方面组   件对象功能

 }

  b.目标对象有接口(采用JDK Proxy API)

      适用于目标组件有接口实现的情况。

      public class $Proxy4 implements 原目标组件接口{

         //重写目标接口方法,在重写的方法中调用目标对象和方面组件对 

           象功能

       }

    public void testDelete() {

String[] confs = { "applicationContext.xml" };

ApplicationContext ac = new ClassPathXmlApplicationContext(confs);

CostService service = (CostService) ac.getBean("costService");

System.out.println("类名:"+service.getClass().getName());

//获得代理类中的所有public方法

                Method[] ms =service.getClass().getMethods();

for(Method m : ms){

System.out.println(m);

}

service.deleteCost();

}Spring经典总结

      程序运行结果如下:

类名:$Proxy4

public final void $Proxy4.addCost()

public final void $Proxy4.deleteCost()

public final void $Proxy4.findById()

public final boolean $Proxy4.isFrozen()

public final org.springframework.aop.TargetSource 

      $Proxy4.getTargetSource()

public final void 

      $Proxy4.addAdvisor(int,org.springframework.aop.Advisor) 

 

  从以上结果可以看出,动态代理类中重写了原实现类中的

         addCost()、deleteCost()、findById()方法并加入了方面(共同

         处理的方法),这样就可以实现对目标对象实现方面切入。

 

4
1
分享到:
评论

相关推荐

    postman测试接口List<JSONObject>类型的参数(csdn)————程序.pdf

    总结来说,通过Postman测试接口传递List&lt;JSONObject&gt;类型的参数,关键在于设置正确的Content-Type,编写符合JSON规范的数组数据,并确保后端控制器能正确解析这些数据。通过这种方式,可以方便地模拟前端行为,进行...

    SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis).pdf

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;slf4j.version&gt;1.7.7&lt;/slf4j.version&gt; &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!...

    springcloud微服务里的oauth2集成总结.docx

    &lt;artifactId&gt;spring-security-oauth2&lt;/artifactId&gt; &lt;version&gt;${spring-security-oauth2.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-...

    springmvc+spring+mybatis集成框架的环境搭建

    &lt;version&gt;${org.springframework-version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-tx&lt;/artifactId&gt; &lt;version&gt;${org.springframework-version}&lt;/...

    ssm搭建。。。

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;slf4j.version&gt;1.7.7&lt;/slf4j.version&gt; &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;/properties&gt; &lt;!-- 添加依赖 -...

    maven整合

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-core&lt;/artifactId&gt; &lt;version&gt;3.0.4.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring...

    SpringMVC项目搭建

    &lt;artifactId&gt;spring-context-support&lt;/artifactId&gt; &lt;version&gt;${spring.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-test&lt;/artifactId&gt; ...

    SSM某马旅游网笔记

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-test&lt;/artifactId&gt; &lt;version&gt;5.3.21&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-webmvc...

    基于Spring2.0的Collection配置使用例子

    &lt;value&gt;Value2&lt;/value&gt; &lt;ref bean="anotherBean"/&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; ``` 在上面的例子中,`myService` Bean的`myList`属性被初始化为包含三个元素的List:两个字符串值和一个引用到`anotherBean`的...

    jersey 2.2 +spring 3.1.0.RELEASE+hibernate 3.3.1.GA maven 配置文件

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;3.1.0.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;...

    Spring Boot使用Log4j2的实例代码

    &lt;artifactId&gt;spring-boot-starter-log4j2&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt; &lt;artifactId&gt;log4j-flume-ng&lt;/artifactId&gt; &lt;version&gt;2.6&lt;/version&gt; &lt;/...

    SSM搭建实例

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.3.15&lt;/version&gt; &lt;/dependency&gt; &lt;!-- Spring MVC依赖 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId...

    Spring/泛型Hibernate的实现

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.3.9&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-tx&lt;/...

    eclipse搭建springCloud项目.docx

    &lt;spring-cloud.version&gt;Greenwich.SR2&lt;/spring-cloud.version&gt; &lt;spring-boot.version&gt;2.1.6.RELEASE&lt;/spring-boot.version&gt; &lt;gson.version&gt;2.6&lt;/gson.version&gt; &lt;/properties&gt; ``` 这些版本号应与当前稳定版本...

    Spring5整合mybatis3

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.x.x.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;...

    springboot 微服务示例.doc

    &lt;spring-cloud.version&gt;2020.0.4&lt;/spring-cloud.version&gt; &lt;/properties&gt; ``` 5. **添加依赖**: - 添加Spring Cloud Eureka Server依赖,用于实现服务发现与注册: ```xml &lt;dependency&gt; &lt;groupId&gt;org.spring...

    提供一个基础的Spring Cloud项目结构以及相关配置和教程 这将包括基本的Spring Cloud组件

    &lt;artifactId&gt;spring-cloud-config-server&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;/...

    搭建Spring和MyBatis框架实验总结.docx

    ### 搭建Spring和MyBatis框架实验总结 #### 一、实验背景与目标 在当前快速发展的软件行业中,采用高效的技术栈是提升开发效率的关键。Spring框架因其强大的功能和广泛的社区支持,在企业级应用开发中占据着...

    spring定时器实现源码

    &lt;artifactId&gt;spring-context-support&lt;/artifactId&gt; &lt;version&gt;5.3.x&lt;/version&gt; &lt;/dependency&gt; &lt;!-- 其他依赖 --&gt; &lt;/dependencies&gt; ``` 确保版本号与你的项目保持一致,并根据需要添加其他依赖。 **启动和运行**...

    spring错误总结.txt

    ### Spring错误总结与解决方案 #### 一、DefaultPointcutAdvisor BeanCreationException **问题描述**: 在尝试创建名为`org.springframework.aop.support.DefaultPointcutAdvisor`的Bean时遇到了`...

Global site tag (gtag.js) - Google Analytics