首页 > 编程语言 > 详细

Spring学习

时间:2019-12-09 22:00:51      阅读:84      评论:0      收藏:0      [点我收藏+]

 

springIOC以及DI概念介绍

技术分享图片

配置web.xml启动Spring

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Spring</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 让Spring随着项目的启动而启动 -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- 配置Spring配置文件位置 -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
 <!-- struts启动 --> <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

Spring使用 - 配置讲解:

① XML配置方式:

使用applicationContext.xml配置bean进行注入

<!-- bean标签属性 -->
● name:bean标识名字 - 可以重复、可以使用特殊字符;
● class:类的完整类名;
● scope:
  ① singleton:单例(大多数) - 创建spring容器的时候,就会立即创建这个单利对象;
  ② prototype:多例(极个别) - 每次获得这个对象的时候才会去创建,而且每次创建的都是新的;
● init-method:负责初始化;
● destory-method:负责销毁;
● property:set注入方式
技术分享图片
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8     http://www.springframework.org/schema/beans/spring-beans.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context.xsd
11     http://www.springframework.org/schema/aop
12     http://www.springframework.org/schema/aop/spring-aop.xsd
13     http://www.springframework.org/schema/tx
14     http://www.springframework.org/schema/tx/spring-tx.xsd">
15 
16     <!-- 配置Action -->
17     <bean name="userAction" class="com.sikiedu.web.UserAction" scope="prototype">
18         <property name="userService" ref="userService"></property>
19     </bean>
20 
21     <!-- 配置Service -->
22     <bean name="userService" class="com.sikiedu.service.UserService">
23         <property name="userDao" ref="userDao"></property>
24     </bean>
25 
26     <!-- 配置Dao -->
27     <bean name="userDao" class="com.sikiedu.dao.UserDao"></bean>
28 
29 </beans>
applicationContext Code

② Spring注解配置

在三层架构中使用注解代替xml配置

● web类注解
 @Controller("userAction");
 @Scope(scopeName="prototype");
● service类注解
 @Service("userService");
● dao类注解
 @Repository("userDao");
● 属性注解 - 一般使用Resource
 @Autowired() // 根据类自动装配; 问题:如果匹配到多个类型一致的对象,将无法注入;
 @Qualifier("userService") // 根据名字自动装配;
 @Resource(name = "userService") // 推荐使用,Autowired+Qualifier的结合体
 ;
技术分享图片
 1 package com.sikiedu.web;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.springframework.context.annotation.Scope;
 6 import org.springframework.stereotype.Controller;
 7 
 8 import com.opensymphony.xwork2.ActionContext;
 9 import com.opensymphony.xwork2.ActionSupport;
10 import com.opensymphony.xwork2.ModelDriven;
11 import com.sikiedu.domain.User;
12 import com.sikiedu.service.UserService;
13 
14 // 等于 <bean name="userAction" class="com.sikiedu.web.UserAction" scope="prototype">
15 @Controller("userAction")
16 @Scope(scopeName = "prototype")
17 public class UserAction extends ActionSupport implements ModelDriven<User> {
18 
19     // @Autowired() // 1-根据类自动装配; 问题:如果匹配到多个类型一致的对象,将无法注入
20     // @Qualifier("userService") // 根据名字自动装配
21     @Resource(name = "userService") // Autowired + Qualifier = @Resource,结合体
22     private UserService userService;
23     public User user = new User();
24 
25     public String login() throws Exception {
26 
27         System.out.println("UserAction...run..." + userService);
28         User temp = userService.findUser(user);
29         if (temp != null) {
30             ActionContext.getContext().getSession().put("user", temp);
31             return "toIndex";
32         } else {
33             ActionContext.getContext().put("error", "用户名或密码错误!!!");
34             return "login";
35         }
36 
37     }
38 
39     @Override
40     public User getModel() {
41         return user;
42     }
43 
44     public UserService getUserService() {
45         return userService;
46     }
47 
48     public void setUserService(UserService userService) {
49         this.userService = userService;
50     }
51 
52 }
UserAction Code
技术分享图片
 1 package com.sikiedu.service;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.hibernate.Transaction;
 6 import org.springframework.stereotype.Service;
 7 
 8 import com.sikiedu.dao.UserDao;
 9 import com.sikiedu.domain.User;
10 import com.sikiedu.utils.HibernateUtils;
11 
12 // 等于 <bean name="userService" class="com.sikiedu.service.UserService">
13 @Service("userService")
14 public class UserService {
15 
16     // @Autowired() // 根据类自动装配
17     // @Qualifier("userDao") // 根据名字自动装配
18     @Resource(name = "userDao") // Autowired + Qualifier = @Resource,结合体
19     private UserDao userDao;
20 
21     public User findUser(User user) {
22 
23         System.out.println("UserService...run..." + userDao);
24 
25         Transaction transaction = HibernateUtils.getCurrentSession().beginTransaction();
26         User temp = null;
27         try {
28             temp = userDao.findUser(user);
29         } catch (Exception e) {
30             transaction.rollback();
31         }
32         transaction.commit();
33 
34         return temp;
35     }
36 
37     public UserDao getUserDao() {
38         return userDao;
39     }
40 
41     public void setUserDao(UserDao userDao) {
42         this.userDao = userDao;
43     }
44 
45 }
UserService Code
技术分享图片
 1 package com.sikiedu.dao;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.query.NativeQuery;
 5 import org.springframework.stereotype.Repository;
 6 
 7 import com.sikiedu.domain.User;
 8 import com.sikiedu.utils.HibernateUtils;
 9 
10 // 等于  <bean name="userDao" class="com.sikiedu.dao.UserDao"></bean>
11 @Repository("userDao")
12 public class UserDao {
13 
14     public User findUser(User user) {
15 
16         System.out.println("userDao...run..." + user);
17 
18         Session session = HibernateUtils.getCurrentSession();
19         String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
20 
21         NativeQuery<User> sqlQuery = session.createSQLQuery(sql);
22         sqlQuery.setParameter(1, user.getUsername());
23         sqlQuery.setParameter(2, user.getPassword());
24         sqlQuery.addEntity(User.class);
25 
26         User temp = sqlQuery.uniqueResult();
27 
28         return temp;
29     }
30 
31 }
UserDao Code

配置applicationContext.xml,spring会自动扫描com.xxx包下面有注解的类,完成Bean的装配。 

技术分享图片
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8     http://www.springframework.org/schema/beans/spring-beans.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context.xsd
11     http://www.springframework.org/schema/aop
12     http://www.springframework.org/schema/aop/spring-aop.xsd
13     http://www.springframework.org/schema/tx
14     http://www.springframework.org/schema/tx/spring-tx.xsd">
15 
16     <!-- 开启哪个包下的注释 开启包的时候,会开启包下的所有子包 -->
17     <context:component-scan base-package="com.sikiedu"></context:component-scan>
18 
19 </beans>
applicationContext.xml

struts.xml

<!-- 告诉struts,不用创建Action,由Spring来创建 -->
<constant name="struts.objectFactory" value="spring"></constant>

aop概念介绍(面向切面的编程)

AOP行话:

● 连接点:目标对象中,所有可以增强的方法
● 切入点:目标对象中,已经增强的方法
● 通知:增强的代码
● 目标对象:被代理的对象
● 织入:将通知应用到切入点的过程
● 代理:将通知织入到目标对象之后,形成的对象
● 切面:切入点+通知

技术分享图片

spring整合Hibernate(小整合)

① 导入c3p0包、spring-orm包、spring-tx包

② applicationContext.xml配置;sessionFactory不用配置绑定线程 否则会报异常

<!-- 配置dataSource -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8&amp;useSSL=true"></property>
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="user" value="root"></property>
    <property name="password" value="123456"></property>
</bean>
<!-- 配置sessionFactory -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.connection.isolation">4</prop>
        </props>
    </property>
    <!-- 配置ORM元数据,会自动扫描该包下的所有配置文件 -->
    <property name="mappingDirectoryLocations" value="classpath:com/sikiedu/domain"></property>
</bean>

③ Dao层配置注入sessionFactory

<!-- 配置Dao -->
<bean name="userDao" class="com.sikiedu.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

④ Dao层继承HibernateDaoSupport类,使用getHibernateTemplate()方法获取Session

package com.sikiedu.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.sikiedu.domain.User;

public class UserDao extends HibernateDaoSupport {

    public User findUser(User user) {

        Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
     // Session session = HibernateUtils.getCurrentSession();

        String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
        NativeQuery<User> sqlQuery = session.createSQLQuery(sql);
        sqlQuery.setParameter(1, user.getUsername());
        sqlQuery.setParameter(2, user.getPassword());
        sqlQuery.addEntity(User.class);

        User temp = sqlQuery.uniqueResult();

        return temp;
    }
}

AOP配置事务

● applicationContext.xml配置

<!-- 配置事务的核心管理器,依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务的通知 -->
<tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/><!-- 所有方法都配置 -->
    </tx:attributes>
</tx:advice>
<!-- 织入 -->
<aop:config>
    <!-- 配置切入点 --><!-- * com.sikiedu.service.*.*(..)表示com.sikiedu.*.*包下的所有类的所有方法;(..)表示方法参数可有可无-->
    <aop:pointcut expression="execution(* com.sikiedu.service.*.*(..))" id="pointcut"/>
    <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>

● 配置web.xml,扩大Session范围

 <!-- 扩大Session范围 -->
 <filter>
     <filter-name>openSession</filter-name>
     <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>openSession</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>
 <!-- //扩大Session范围 -->

● service层使用

技术分享图片
 1 package com.sikiedu.service;
 2 
 3 import com.sikiedu.dao.UserDao;
 4 import com.sikiedu.domain.User;
 5 
 6 public class UserService {
 7 
 8     private UserDao userDao;
 9 
10     public User findUser(User user) {
11 
12         User temp = null;
13         temp = userDao.findUser(user);
14         return temp;
15     }
16 
17     public UserDao getUserDao() {
18         return userDao;
19     }
20 
21     public void setUserDao(UserDao userDao) {
22         this.userDao = userDao;
23     }
24 
25 }
UserService Code

 

 

 

Spring学习

原文:https://www.cnblogs.com/Dm920/p/11823745.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!