Spring详细教程

一文学会Spring,Spring最简单的入门教程(万字好文) spring教程 阅读详情

Spring学习总结----

一、导入Spring必须的jar包

二、简单示例入门注入一个User

1.编写User实体类

复制代码
package test.Spring.helloworld;

import java.util.List;
import java.util.Map;

public class User {
@Override
public String toString() {
return “User [id=” + id + “, name=” + name + “]”;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;

}

复制代码

2.编写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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd" 
        >
  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="User"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="test.Spring.helloworld.User"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="jayjay"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span>

</beans>

复制代码

3.利用Spring容器创建托管对象User

        ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
        User u = (User)context.getBean("User");
        System.out.println(u);

三、Bean的配置深入

1.bean引用其他bean

实体类示例:

复制代码
package test.Spring.helloworld;

public class HelloWorld {
public User getUser() {
return user;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setUser(User user) {
    </span><span style="color: #0000ff;">this</span>.user =<span style="color: #000000;"> user;
}

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String toString() {
    </span><span style="color: #0000ff;">return</span> "HelloWorld [name=" + name + ", user=" + user + "]"<span style="color: #000000;">;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
    </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> User user;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> HelloWorld(){
    
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> HelloWorld(String name){
    </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

}

复制代码

配置示例:

复制代码
    <!-- reference other bean -->
    <bean id="HelloWorld" class="test.Spring.helloworld.HelloWorld">
        <!-- <property name="name" value="spring1"></property> -->
        <constructor-arg value="spring2" type="java.lang.String"></constructor-arg>
        <property name="user">
            <ref bean="User"/>
        </property>
    </bean>
复制代码

调用方法依然是根据bean中的id

2.集合bean配置

实体类示例:

复制代码
package test.Spring.helloworld;

import java.util.List;
import java.util.Map;

public class User {
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return “User [id=” + id + “, name=” + name + “, list=” + list
+ “, map=” + map + “]”;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;
private List<String> list;
private Map<String,Integer> map;

}

复制代码

配置示例:

复制代码
    <!-- Configure the list bean -->
    <bean id="testList" class="test.Spring.helloworld.User">
        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
                <value>list3</value>
            </list>
        </property>
    </bean>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> configure the map </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="testMap"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="test.Spring.helloworld.User"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="map"</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">map</span><span style="color: #0000ff;">&gt;</span>
            <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="first"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">entry</span><span style="color: #0000ff;">&gt;</span>
            <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="second"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="2"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">entry</span><span style="color: #0000ff;">&gt;</span>
            <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="third"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="3"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">entry</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">map</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></pre>
复制代码

3.Properties类型的bean

实体类示例:

复制代码
package test.Spring.helloworld;

import java.util.Properties;

public class DataSource {
@Override
public String toString() {
return “Properties [properties=” + properties + “]”;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Properties getProperties() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> properties;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setProperties(Properties properties) {
    </span><span style="color: #0000ff;">this</span>.properties =<span style="color: #000000;"> properties;
}

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Properties properties;

}

复制代码

配置示例:

复制代码
    <!-- configure the properties -->
    <bean id="dataSource1" class="test.Spring.helloworld.DataSource">
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="password">1234</prop>
                <prop key="jdbcUrl">jdbc:mysql:///test</prop>
                <prop key="driverClass">com.mysql.jdbc.Driver</prop>
            </props>
        </property>
    </bean>
复制代码

4.使用Util定义引用其他bean的公共集合

需要先在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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-4.0.xsd"
        xmlns:util="http://www.springframework.org/schema/util"    
        >    
</beans>
复制代码

集合以及调用的xml配置

复制代码
    <!-- if properties of collection are beans -->
    <util:list id="users">
        <ref bean="User"/>
        <ref bean="User"/>
        <ref bean="User"/>
    </util:list>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="Users"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="test.Spring.helloworld.Users"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="list"</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ref </span><span style="color: #ff0000;">bean</span><span style="color: #0000ff;">="users"</span><span style="color: #0000ff;">/&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></pre>
复制代码

5.使用p简化bean的属性赋值

首先,导入p的命名空间

xmlns:p="http://www.springframework.org/schema/p"

实体类实例:

复制代码
package test.Spring.helloworld;

import java.util.List;
import java.util.Map;

public class User {
@Override
public String toString() {
return “User [id=” + id + “, name=” + name + “]”;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;

}

复制代码

配置示例:

    <!-- use p to write the bean quickly and conveniently -->
    <bean id="User1" class="test.Spring.helloworld.User" p:id="2" p:name="jayjay2" />

6.abstract模板bean

设置abstract=true表明此bean是模板bean,为其他bean提供属性值模板

    <!-- template bean -->
    <bean abstract="true"  id="template" p:id="50" p:name="fromTemplate"></bean>
    <bean id="User2" parent="template" class="test.Spring.helloworld.User"></bean>

7.单例bean和原型bean

    <!-- use scope to build singleton/prototype bean -->
    <bean id="User3" parent="template" scope="singleton" class="test.Spring.helloworld.User"></bean>
    <bean id="User4" parent="template" scope="prototype" class="test.Spring.helloworld.User"></bean>

singleton:此bean为单例,在context创建时已经创建,并且只有一个实例。

prototype:当需要时创建实例。

8.静态工厂方法配置bean

静态工厂类示例:

复制代码
package test.Spring.FactoryBean;

import java.util.HashMap;
import java.util.Map;

public class StaticFactoryMethod {
public static Map<String,Person> map = new HashMap<String,Person>();

</span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {
    map.put(</span>"first", <span style="color: #0000ff;">new</span> Person(1,"jayjay1"<span style="color: #000000;">));
    map.put(</span>"second", <span style="color: #0000ff;">new</span> Person(2,"jayjay2"<span style="color: #000000;">));
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Person getPerson(String key){
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> map.get(key);
}

}

复制代码

配置示例:

    <!-- static factory method -->    
    <bean id="person" factory-method="getPerson" class="test.Spring.FactoryBean.StaticFactoryMethod">
        <constructor-arg value="first" type="java.lang.String"></constructor-arg>
    </bean>

9.实例工厂方法配置bean

工厂类示例:

复制代码
package test.Spring.FactoryBean;

import java.util.HashMap;
import java.util.Map;

public class InstanceFactoryMethod {
public static Map<String,Person> map = new HashMap<String,Person>();

</span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {
    map.put(</span>"first", <span style="color: #0000ff;">new</span> Person(1,"jayjay1"<span style="color: #000000;">));
    map.put(</span>"second", <span style="color: #0000ff;">new</span> Person(2,"jayjay2"<span style="color: #000000;">));
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Person getPerson(String key){
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> map.get(key);
}

}

复制代码

配置示例:

    <!-- instance factory method -->
    <bean id="InstanceFactoryMethod" class="test.Spring.FactoryBean.InstanceFactoryMethod"></bean>
    <bean id="person1" factory-bean="InstanceFactoryMethod" factory-method="getPerson">
        <constructor-arg value="second"></constructor-arg>
    </bean>

10.通过实现FactoryBean完成bean的配置

需要对FactoryBean接口的3个方法进行适当重写

PersonFactoryBean类示例:

复制代码
package test.Spring.FactoryBean;

import org.springframework.beans.factory.FactoryBean;

public class PersonFactoryBean implements FactoryBean<Person>{

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getId() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setId(<span style="color: #0000ff;">int</span><span style="color: #000000;"> id) {
    </span><span style="color: #0000ff;">this</span>.id =<span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
    </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> id;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

@Override
</span><span style="color: #0000ff;">public</span> Person getObject() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person(id,name);
}

@Override
</span><span style="color: #0000ff;">public</span> Class&lt;?&gt;<span style="color: #000000;"> getObjectType() {
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
    <span style="color: #0000ff;">return</span> Person.<span style="color: #0000ff;">class</span><span style="color: #000000;">;
}

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> isSingleton() {
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}

}

复制代码

配置示例:

    <!-- use factory bean to get a instance -->
    <bean id="person2" class="test.Spring.FactoryBean.PersonFactoryBean">
        <property name="id" value="3"></property>
        <property name="name" value="FactoryBean"></property>
    </bean>

四、通过注解配置bean

加上注解的类会被Spring容器管理

@Component

    标注于通用实体类

@Controller

    标注于Controller/Action

@Service

    标注于Service

@Respository

    标注于RespositoryImpl/DaoImlp

@Autowired

    依据类型自动装配

@Qualifier

    指定自动装载的bean的name

1.在Spring配置文件中导入context命名空间,并加入

<context:component-scan base-package="test.Spring.Annotation"></context:component-scan>

表示Spring将扫描test.Spring.Annotation及其子包中所有java文件,并将带有注解的类加入Spring容器进行管理。

例如:

复制代码
<?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
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" 
        xmlns:context="http://www.springframework.org/schema/context">
        <context:component-scan base-package="test.Spring.Annotation"></context:component-scan>
</beans>
复制代码

2.模拟三层,并用Spring注解方式注入

项目结构:

Person实体类

复制代码
package test.Spring.Annotation;
import org.springframework.stereotype.Component;

@Component
public class Person {
@Override
public String toString() {
return “Person [id=” + id + “, name=” + name + “]”;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> id;    
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

}

复制代码

PersonController

复制代码
package test.Spring.Annotation.Controller;

import org.springframework.stereotype.Controller;

@Controller
public class PersonController {
public void excute(){
System.out.println(“PersonController.excute()…”);
}
}

复制代码

PersonService

复制代码
package test.Spring.Annotation.Service;

import org.springframework.stereotype.Service;

@Service
public class PersonService {
public void add(){
System.out.println(“PersonService.add()…”);
}
}

复制代码

PersonRepository接口

package test.Spring.Annotation.Repository;

public interface PersonRepository {
void add();
}

PersonRepositoryImpl接口实现类

复制代码
package test.Spring.Annotation.Repository;

import org.springframework.stereotype.Repository;

@Repository
public class PersonRepositoryImpl implements PersonRepository {

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> add() {
    System.out.println(</span>"PersonRepositoryImpl.add()..."<span style="color: #000000;">);    
}

}

复制代码

Main类中测试

复制代码
package test.Spring.Annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.Spring.Annotation.Controller.PersonController;
import test.Spring.Annotation.Repository.PersonRepository;
import test.Spring.Annotation.Service.PersonService;

public class Main {
public static void main(String[] args) {
ApplicationContext context =new ClassPathXmlApplicationContext(“applicationContextForAnnotation.xml”);

    </span><span style="color: #008000;">//</span><span style="color: #008000;">inject the common bean</span>
    System.out.println(context.getBean("testAutowired"<span style="color: #000000;">));
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">inject the repository</span>
    PersonRepository pr = (PersonRepository)context.getBean("personRepositoryImpl"<span style="color: #000000;">);
    pr.add();
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">inject the controller</span>
    PersonController pc = (PersonController)context.getBean("personController"<span style="color: #000000;">);
    pc.excute();
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">inject the service</span>
    PersonService ps = (PersonService)context.getBean("personService"<span style="color: #000000;">);
    ps.add();
    
    
}

}

复制代码

3.泛型三层的注入

Spring配置文件

复制代码
<?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
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        " 
        xmlns:context="http://www.springframework.org/schema/context"    
        >
    <context:component-scan base-package="test.Spring.Generic.di"></context:component-scan>
</beans>
复制代码

BaseRespository

复制代码
package test.Spring.Generic.di;

public class BaseRepository<T> {

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> save() {
    System.out.println(</span>"repository.save()..."<span style="color: #000000;">);
}

}

复制代码

PersonRepository

package test.Spring.Generic.di;

public interface PersonRespository {
void save();
}

PersonRepositoryImpl

继承BaseRepository就不需要再写一次save方法,且同时实现了PersonRepository接口

复制代码
package test.Spring.Generic.di;

import org.springframework.stereotype.Repository;

import test.Spring.Annotation.Person;

@Repository
public class PersonRespositoryImpl extends BaseRepository<Person> implements PersonRespository {

}

复制代码

BaseService对Dao进行自动装配,子类继承后装配的是子类Respository

复制代码
package test.Spring.Generic.di;

import org.springframework.beans.factory.annotation.Autowired;

public class BaseService<T> {

@Autowired
</span><span style="color: #0000ff;">protected</span> BaseRepository&lt;T&gt;<span style="color: #000000;"> baseRespository;

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> save(){
    System.out.println(</span>"service.save()..."<span style="color: #000000;">);
    System.out.println(baseRespository);
}

}

复制代码

PersonService继承了BaseService,就不需要再写实现save方法,定义Repository字段了

复制代码
package test.Spring.Generic.di;

import org.springframework.stereotype.Service;

import test.Spring.Annotation.Person;

@Service
public class PersonService extends BaseService<Person>{

}

复制代码

Main类中调用

复制代码
package test.Spring.Generic.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context =new ClassPathXmlApplicationContext(“applicationContextForGeneric.xml”);
PersonService ps = (PersonService)context.getBean(“personService”);
ps.save();
}
}

复制代码

输出为

第二句说明调用的是继承BaseService的PersonService拿到的Respository是PersonRepositoryImpl,说明泛型注入成功。    

 

 十、使用SpringAOP完成简单的程序

1.导入SpringAOP所需jar包

2.编写spring的配置文件applicationContext.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"
xsi:schemaLocation</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-4.0.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
    "</span><span style="color: #ff0000;">
    xmlns:util</span><span style="color: #0000ff;">="http://www.springframework.org/schema/util"</span><span style="color: #ff0000;">
    xmlns:p</span><span style="color: #0000ff;">="http://www.springframework.org/schema/p"</span><span style="color: #ff0000;">
    xmlns:context</span><span style="color: #0000ff;">="http://www.springframework.org/schema/context"</span><span style="color: #ff0000;">
    xmlns:aop</span><span style="color: #0000ff;">="http://www.springframework.org/schema/aop"</span>    
    <span style="color: #0000ff;">&gt;</span>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> configure the package for spring to scan </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context:component-scan </span><span style="color: #ff0000;">base-package</span><span style="color: #0000ff;">="test.Spring.AOP"</span> <span style="color: #0000ff;">/&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> make the aspectj annotation to be used </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:aspectj-autoproxy</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">aop:aspectj-autoproxy</span><span style="color: #0000ff;">&gt;</span>

</beans>

复制代码

3.创建一个HelloWord接口以及它的实现类HelloWordImpl

public interface HelloWord {
    public int sayHello(int num);
}
复制代码
@Component
public class HelloWordImpl implements HelloWord{
    public int sayHello(int num){
        System.out.println("hello word");
        return 100/num;
    }
}
复制代码

4.SpringAOP注释的类型有5种

@Before 前置通知 在方法执行前执行

@After 后置通知 在方法执行后执行

@AfterThrowing 异常通知 在方法抛出异常之后执行

@AfterReturning 返回通知 在方法返回结果之后执行

@Around 环绕通知 环绕着方法执行

5.创建一个切面类(包含@Before @After @AfterThrowing @AfterReturning)

复制代码
@Component
@Aspect
public class HelloWordAspect {
@Before(value</span>="execution(* test.Spring.AOP.HelloWord.sayHello(..))"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> beforeMethod(JoinPoint jp){
    String methodName </span>=<span style="color: #000000;"> jp.getSignature().getName();
    System.out.println(methodName);
    System.out.println(</span>"before method execute,args are "+<span style="color: #000000;">Arrays.toString(jp.getArgs()));
}

@After(</span>"execution(* test.Spring.AOP.HelloWord.sayHello(..))"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> afterMethod(JoinPoint jp){
    System.out.println(</span>"after method execute,args are "+<span style="color: #000000;">Arrays.toString(jp.getArgs()));
}

@AfterThrowing(value</span>="execution(* test.Spring.AOP.HelloWord.sayHello(..))",throwing="ex"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> afterThrow(Exception ex){
    System.out.println(</span>"afterThrow"+<span style="color: #000000;">ex.getMessage());    
}

@AfterReturning(value</span>="execution(* test.Spring.AOP.HelloWord.sayHello(..))",returning="result"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> afterReturn(Object result){
    System.out.println(</span>"the result is "+<span style="color: #000000;">result);
}

}

复制代码

6.在主函数调用

复制代码
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextForAOP.xml");
    HelloWord hw </span>= (HelloWord) context.getBean("helloWordImpl"<span style="color: #000000;">);
    hw.sayHello(</span>10<span style="color: #000000;">);
}

}

复制代码

7.调用结果

结果说明,在sayHello方法是被Spring代理执行了,执行前后加上了一些切面类中定义的信息。

8.使用Around环绕通知切面类实现类似效果

 

复制代码
@Component
@Aspect
public class HelloWordAspectAround {
    @Around(value="execution(* test.Spring.AOP.HelloWord.sayHello(..)))")
    public Object aroundMethod(ProceedingJoinPoint pjp){
        Object result = null;
        String methodName = pjp.getSignature().getName();
        try {
            result = pjp.proceed();        
            System.out.println("the result is "+result);
        } catch (Throwable e) {
            System.out.println("Exception occurs : "+e.getMessage());
            throw new RuntimeException(e);
        }
        System.out.println(methodName+" end");
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result;
}

}

复制代码

 

十一、SpringAOP整合Hibernate并使用事务(模拟买书的过程)

1.内容准备

①.编写实体类

Book

复制代码
public class Book {
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    private int id;
    private String name;
    private int price;
    private int count;
}
复制代码

Customer

复制代码
public class Customer {
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getBalance() {
        return balance;
    }
    public void setBalance(int balance) {
        this.balance = balance;
    }
    private int id;
    private String name;
    private int balance;
}
复制代码

②.编写实体类映射文件

复制代码
<hibernate-mapping package="springaop.model">
    <class name="Book" table="t_book">
        <id name="id" type="int" column="id" >
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" column="name"/>
        <property name="price" type="int" column="price"/>
        <property name="count" type="int" column="count"/>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span>

</hibernate-mapping>

复制代码
复制代码
<hibernate-mapping package="springaop.model">
    <class name="Customer" table="t_customer">
        <id name="id" type="int" column="id" >
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" column="name"/>
        <property name="balance" type="int" column="balance"/>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span>

</hibernate-mapping>

复制代码

③.编写dao及daoImpl

public interface ShopRepository {
    public int findBookPriceByBookName(String name);
    public void updateBookCount(String name);
    public void updateUserBalance(String name,int price);
}
复制代码
@Repository
public class ShopRepositoryImpl implements ShopRepository{
@Autowired
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SessionFactory sessionFactory;

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Session getSession(){
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sessionFactory.getCurrentSession();
}

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> findBookPriceByBookName(String name) {
    String sql </span>= "select b.price from Book b where b.name=?"<span style="color: #000000;">;
    Query query </span>= getSession().createQuery(sql).setString(0<span style="color: #000000;">, name);
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> (Integer)query.uniqueResult();
}

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> updateBookCount(String name) {
    String sql1 </span>= "select b.count from Book b where b.name=?"<span style="color: #000000;">;
    Query query </span>= getSession().createQuery(sql1).setString(0<span style="color: #000000;">,name);
    </span><span style="color: #0000ff;">int</span> count = (<span style="color: #0000ff;">int</span><span style="color: #000000;">)query.uniqueResult();
    </span><span style="color: #0000ff;">if</span>(count&lt;=0<span style="color: #000000;">){
        </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> RuntimeException("库存不足"<span style="color: #000000;">);
    }
    
    String sql2 </span>= "update Book b set b.count=b.count-1 where b.name=?"<span style="color: #000000;">;
    getSession().createQuery(sql2).setString(</span>0<span style="color: #000000;">,name).executeUpdate();        
}

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> updateUserBalance(String name, <span style="color: #0000ff;">int</span><span style="color: #000000;"> price) {
    String sql1 </span>= "select c.balance from Customer c where c.name=?"<span style="color: #000000;">;
    Query query </span>= getSession().createQuery(sql1).setString(0<span style="color: #000000;">,name);
    </span><span style="color: #0000ff;">int</span> count = (<span style="color: #0000ff;">int</span><span style="color: #000000;">)query.uniqueResult();
    </span><span style="color: #0000ff;">if</span>(count-price&lt;0<span style="color: #000000;">){
        </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> RuntimeException("余额不足"<span style="color: #000000;">);
    }
    
    String sql2 </span>= "update Customer c set c.balance=c.balance-? where c.name=?"<span style="color: #000000;">;
    getSession().createQuery(sql2).setInteger(</span>0, price).setString(1<span style="color: #000000;">,name).executeUpdate();    
}

}

复制代码

④.编写service及serviceImpl

public interface ShopService {
    public void shop(String bookName,String username);
}
复制代码
@Service
public class ShopServiceImpl implements ShopService{
@Autowired
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> ShopRepository sr;

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> shop(String bookName, String username) {
    </span><span style="color: #0000ff;">int</span> price =<span style="color: #000000;"> sr.findBookPriceByBookName(bookName);
    sr.updateUserBalance(username, price);
    sr.updateBookCount(bookName);
}

}

复制代码

2.加入Hibernate

①.添加hibernate必须的jar包

 

②.添加hibernate.cfg.xml

复制代码
<hibernate-configuration>
    <session-factory>
        <!-- 配置hibernate的基本属性 -->    
        <!-- 1.数据源的配置,配置到SpringIOC中,此处不需要再进行配置 -->
        <!-- 2.关联实体的映射文件 .hbm.xml文件也在IOC容器配置SessionFactory实例时配置 -->
        <!-- 3.配置hibernate的基本属性  方言、sql显示及格式化、数据库表生成策略、二级缓存-->        
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置hibernate二级缓存相关 </span><span style="color: #008000;">--&gt;</span>
    
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session-factory</span><span style="color: #0000ff;">&gt;</span>

</hibernate-configuration>

复制代码

 

3.加入Spring

①.导入Spring必须的jar包

②.配置Spring的applicationContext.xml及db.properties文件

复制代码
<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 
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd             
        "
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"    
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        >
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置Spring扫描的包 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context:component-scan </span><span style="color: #ff0000;">base-package</span><span style="color: #0000ff;">="springaop"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">context:component-scan</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置数据源 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 导入资源文件 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context:property-placeholder </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="classpath:db.properties"</span><span style="color: #0000ff;">/&gt;</span>

<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="com.mchange.v2.c3p0.ComboPooledDataSource"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="user"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.user}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.password}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="driverClass"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.driverClass}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="jdbcUrl"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.jdbcUrl}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="initialPoolSize"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.initialPoolSize}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxPoolSize"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="${jdbc.maxPoolSize}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置Hibernete的SessionFactory实例 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 通过配置Spring提供的LcalSessionFactory </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate4.LocalSessionFactoryBean"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="configLocation"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="classpath:hibernate.cfg.xml"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="mappingLocations"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="classpath:springaop/model/*.hbm.xml"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置Spring的声明式事务 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 1.配置事务管理器 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="transactionManager"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate4.HibernateTransactionManager"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 2.配置事务属性 </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:advice </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;"> transaction-manager</span><span style="color: #0000ff;">="transactionManager"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*"</span><span style="color: #0000ff;">/&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:advice</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 3.配置事务切点,并把切点和事务关联起来, </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:pointcut </span><span style="color: #ff0000;">expression</span><span style="color: #0000ff;">="execution(* springaop.service.*.*(..))"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="txPointcut"</span><span style="color: #0000ff;">/&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:advisor </span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;"> pointcut-ref</span><span style="color: #0000ff;">="txPointcut"</span><span style="color: #0000ff;">/&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span>

</beans>

复制代码
复制代码
jdbc.user=root
jdbc.password=1234
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test

jdbc.initialPoolSize=5
jdbc.maxPoolSize=10

复制代码

4.运行测试

复制代码
public class test {
    private ApplicationContext context = null;
</span><span style="color: #0000ff;">private</span> ShopService ss = <span style="color: #0000ff;">null</span><span style="color: #000000;">;

{
    context </span>= <span style="color: #0000ff;">new</span> ClassPathXmlApplicationContext("applicationContext.xml"<span style="color: #000000;">);
    ss</span>= context.getBean(ShopService.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
}


@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> test() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException{
    DataSource ds </span>= context.getBean(DataSource.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
    System.out.println(ds.getConnection());
}

@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> test1(){
    ss.shop(</span>"Java", "jayjay"<span style="color: #000000;">);
}

@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> test3(){
    ss.shop(</span>"C", "jayjay"<span style="color: #000000;">);
}

}

复制代码

当钱不够的时候,会抛出异常“余额不足”,并且事务回滚;当钱足够时,正常执行。

 

源码下载:SpringAOP整合Hibernate并使用事务(模拟买书的过程)-源码

转自:Spring详细教程

Spring全面讲解(无比详细) 希望大家共同进步,有兴趣的可以互相加个关注。 阅读详情

相关推荐

Spring Boot 集成 Spring Cloud 的详细教程

在 Spring Initializr 中生成一个新的 Spring Boot 项目,添加依赖 “Spring Cloud Starter Gateway” 和 “Spring Cloud Starter Netflix Eureka Client”。:在 Spring Initializr 中生成一个新的 Spring Boot 项目,添加依赖 “Spring Cloud Starter Netflix Eureka Server”。文件中配置服务的基本信息和 Eureka 服务注册中心的地址。

坚持写博客,大家的关注是我前进的动力! 1139

Spring 最全入门教程详解

Spring 基础框架,可以视为Spring 基础设施,基本上任何其他 Spring 项目都是以 SpringFramework 为基础的。Spring 5 的模块结构图: lOC: Inversion of Control,翻译过来是反转控制。把对象创建和对象之间的调用过程,交给 Spring 进行管理Spring 的IOC 容器就是IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建IOC容器。Spring 提供了IOC容器的两种实现方式:

lucky_fd的博客 1万+

Spring框架详细教程文档

Spring框架是企业级Java开发的核心框架,提供全面的编程和配置模型。核心特性包括控制反转(IoC)、依赖注入(DI)和面向切面编程(AOP)。IoC容器管理Bean的生命周期,支持多种作用域(singleton、prototype等)和配置方式(XML/注解/Java)。AOP实现横切关注点,提供五种通知类型。事务管理支持声明式和编程式两种方式,具有七种传播行为和四种隔离级别。资源管理统一访问各类资源,SpEL表达式语言支持运行时查询和操作对象图。Spring生态系统还包括Spring Boot、MV

weixin_51040479的博客 1048

全网最详细的Spring入门教程

其实spring的来源就是一个词语,完全解耦,为什么叫做完全解耦,还得从两个类的调用说起,接口1的实现类,我们叫做类1,接口2的实现类,我们叫做类2,现在我们有一个前提条件,就是,类2里面去new类1,且把类1的方法给到类2使用,我们现在形容类2和类1有依赖关系,也就是类2要依赖类1,那么如果出现一个境况也就是如果类1发生了改变,那么我们如何去使用类2,那我们在使用类2的时候就需要去改变类2里面的代码,一方面需要从新new一次类1,二方面需要把类2里面的方法对应新的类1的方法。我们采用set注入的方式。

YoYoYoWhatIsUp的博客 3576

HT7036计量芯片SPI通信与数据读取实战解析

本文详细解析HT7036计量芯片的SPI通信与数据读取实战,涵盖SPI时序配置、命令发送、数据读取及常见问题排查。重点介绍如何通过SPI接口与MCU通信,实现电能数据的稳定采集与处理,为智能电表等应用提供实用解决方案。

vscode5coder的博客 265

从零开始:Ubuntu 24.04 LTS + Win11双系统安装教程

本文将简单直白介绍如何从零开始在同一台电脑上安装 Ubuntu 24.04 LTS 和 Windows 11,你可以在需要进行专业开发或运维工作时,轻松切换到 Ubuntu,享受其带来的高效与自由;而在日常学习生活和娱乐休闲时,依然可以无缝使用熟悉的 Windows 环境。

萑澈的博客 8116

Spring 入门教程

Spring 入门教程 1、参考资料 尚硅谷-Spring5框架最新版教程(idea版) 雷丰阳spring、springmvc、mybatis、spring一站式学习 项目地址:oneby1314/spring-learn 2、Spring 概述 2.1、Spring 框架概述 Spring 是轻量级的开源的 JavaEE 框架 Spring 为简化企业级开发而生,使用Spring,Javabean就可以实现很多以前要靠EJB才能实现的功能 Spring 有两个核心部分:IOC 和 AOP

Oneby的博客 1万+

保姆级教程:在NXPS32144环境下安装EB TRESOS 29.0.0并配置MCAL开发环境

本文提供了一份详细的保姆级教程,指导如何在NXP S32K144环境下安装EB TRESOS 29.0.0并配置MCAL开发环境。内容涵盖从前期资源准备、软件安装步骤、核心的MCAL关联配置,到首次创建AUTOSAR工程并进行模块配置的全流程,旨在帮助汽车电子开发者搭建稳定、可用的底层软件开发地基。

wind6的博客 957

spring 详细教程

Spring是一个开源的Java平台,它提供了全面的基础设施支持,以便你可以专注于你的业务逻辑。Spring框架包含多个模块,如Spring Core、Spring MVC、Spring Data、Spring Security等。以下是一份详细的Spring框架教程,包括环境搭建、基本概念、核心组件和实践示例。这个教程提供了Spring框架的全面概览,包括环境搭建、核心概念、Web开发、数据访问、安全性、监控和高级主题。Spring管理的组件称为Bean,它们在Spring容器中被创建和管理。

2401_84572204的博客 402

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2037

【SPSS操作】Non-parametric ANCOVA (Quade‘s) in SPSS

在SPSS中执行Quade的非参数ANCOVA需要手动计算步骤,因为SPSS没有内置的菜单选项。以下是详细的操作指南。

weixin_43689393的博客 1278

Spring教程

罗德·约翰逊(Rod Johnson)创建的Spring框架是一个功能非常强大的Inversion of control(IoC)框架,可帮助分离项目组件的依赖关系。 在本系列教程中,它提供了许多使用Spring框架的分步示例和说明。 新的Spring 3.0教程(23/06/2011) 添加了许多有关使用Spring EL,JavaConfig,AspectJ和Spring ...

一名可爱的技术搬运工 508

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 847

较为详细的spring教程

较为详细的spring教程

renzheyi19880519的专栏 163

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3633

YOLO11 改进 - C2PSA | C2PSA融合HEWL(高频增强小波层):小波逆变换+双通道注意力增强+高频显式增强 | TGRS 2026

本文介绍了高频增强小波层(HEWL),一种专为解决红外小目标检测中边缘退化与语义模糊问题设计的上采样模块。该方法结合小波逆变换与交替通道注意力(ALCA),通过显式增强高频细节并优化特征融合,实现精准的边缘重建与语义对齐。我们将 HEWL 融入 PSABlock 结构构建了 C2PSA_HEWL 模块,并成功集成进 YOLO11 的骨干网络,替代原有的 C2PSA 模块。实验证明,结合 HEWL 的 YOLO11 在检测任务中表现优异,有效提升了模型对细节特征的捕捉能力。

魔改工程师的博客 103

一篇非常好的Spring教程

发现了一个Spring入门系列的教程,讲的比较细致和透彻。 Liu Lixiang的博客

借你一秒 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Spring】全网最详细的Spring入门教程!

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

mf97532的博客 1514

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

spring教程

spring教程spring API

菜鸡程序猿的博客 262

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring教程推荐

推荐一个java教程网站:how2j,教程从ssh、ssm、spring mvc 、spring boot、spring cloud都有,简单易懂,方便入门。 前端练手项目,模仿天猫前端:http://how2j.cn/k/tmall-front/tmall-front-790/790.html?p=13028 JAVA WEB J2EE 练手项目,模仿天猫整站:http://how2j....

qq_37658806的博客 522

视频教程-spring cloud与spring boot实战视频教程-Java

spring cloud与spring boot实战视频教程 从事互联网开发...

weixin_30194621的博客 1723
上一篇: 深入理解java对象的创建过程:类的初始化和实例化
下一篇: 转发和重定向的区别
冷静BB
博客等级 码龄12年 298粉丝 112原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值