VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • java教程之Spring (2)框架(2)

 

2.2.5. @Value注解

<value>

//value只能设置,标量类型=基础数据类型+包装类+String

@Value注解:注入基本数据类型以及它们的包装类String类型数据的支持${}注入Properties文件的键值对,等同 <proprty name=”...” value=”${Key}”>

 

属性:

  value注入基本数据类型和String类型数据的

2.2.5.1. 案例代码

package cn.zj.spring.dao.impl;

 

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

import org.springframework.stereotype.Repository;

 

import cn.zj.spring.dao.UserDao;

import cn.zj.spring.pojo.User;

 

 

@Repository

public class UserDaoImpl implements UserDao {

 

/**

 * @Value(value="")

 * 可以从Spring容器读取 .properties 配置文件内容

 * value :配置文件的对应的key -->使用 ${key} 获取

 * 程序运行中自动将 properties 对应key的获取出来设置给字段

 *

 */

 

//等价 <property name="driverClassName" value="${jdbc.driverClassName}">

@Value("${jdbc.driverClassName}")

private String driverClassName;

 

@Value("${jdbc.url}")

private String url;

 

@Value("${jdbc.username}")

private String username;

 

@Value("${jdbc.password}")

private String password;

 

//@Value("${jdbc.maxActive}")

@Value("100") //开发者也手动赋值

private String maxActive;

 

 

@Override

public void insert(User user) {

System.out.println(driverClassName);

System.out.println(url);

System.out.println(username);

System.out.println(password);

System.out.println(maxActive);

 

}

}

 

 

 

 

3. 模拟注册功能(使用注解方式)

3.1. DAO层代码

//@Component("userDao")

@Repository("userDao")

public class UserDaoImpl implements UserDao {

@Override

public void insert(User user) {

System.out.println("注册的Dao方法执行");

}

}

 

3.2. Service层代码

@Service("userService")

public class UserServiceImpl implements UserService {

 

/*@Autowired

@Qualifier("userDao")*/

 

@Resource(name="userDao")

private UserDao dao;

 

@Override

public void register(User user) {

dao.insert(user);

}

//因为要用

public void setDao(UserDao dao) {

this.dao = dao;

}

}

3.3. 表现层代码

@Controller

public class UserController {

/*@Autowired

@Qualifier("userService")*/

@Resource(name="userService")

private UserService service;

 

public void register(User user) {

 

service.register(user);

}

}

 

3.4. 测试代码

public class UserServletTest {

 

@Test

public void testSpring() throws Exception { //创建用户对象:模拟接受用户参数,封装对象的过程

User user = new User();

user.setUsername("张三");

user.setPassword("admin");

        UserController controller = context.getBean("userController",CustomerController.class);

//执行注册操作

controller.register(user);

}

}

 

3.5. applicationContext.xml

配置文件(只需要配置一个包扫描即可)

<!-- 配置包扫描

cn.zj.spring : 此包以及子包全部被扫描

 -->

<context:component-scan base-package="cn.zj.spring"/>

 

 

 

4. 纯注解配置

4.1. 问题

我们发现,之所以我们现在离不开xml配置文件,是因为我们有一句很关键的配置:

<!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 -->

<context:component-scan base-package="cn.zj.spring"></context:component-scan>

如果他要也能用注解配置,那么我们就可以脱离xml文件了。

 

通过@Configuration注解和@ComponentScan注解

 

 

替换XML配置文件的

@Configuration注解

 

@Configuration配置类注解,在纯注解配置中,类加了该注解,就意味着该类是Spring的配置类。该类的功能就是用于替代原来的XML配置文件。

 

作用:

用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationConfigApplicationContext(@Configuration注解的类.class)

 

@ComponentScan注解

 

@ComponentScan注解扫描类,作用就是配置扫描Spring组件类的路径。功能等同原来配置文件的

--作用:

用于指定spring在初始化容器时要扫描的包。作用和在springxml配置文件中的:

<context:component-scan base-package="cn.zj.spring"/>是一样的。

--属性:

basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。

 

@PropertySource注解

 

作用:

用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。

属性:

value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:

 

@Bean注解

 

作用:

该注解只能写在方法上,使用此方法创建一个对象,并且放入spring容器。它就相当于我们之前在xml配置中介绍的<bean标签>

 

属性:

name:给当前@Bean注解方法创建的对象指定一个名称(beanid)。

 

@Import注解

 

作用:

用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。

<import >

属性:

value[]:用于指定其他配置类的字节码。

 

 

4.2. 示例代码

4.2.1. 简单入门

4.2.1.1. 说明

需求:通过一个简单的入门示例,实现创建一个配置类使用@Configuration注解@ComponentScan注解替换xml文件。

 

4.2.1.2. 配置步骤

 

 

4.2.1.2.1. 第一步:创建一个Java项目

创建一个Java项目,导入必须的jar包以及编写好需要的类结构。代码目录如下:

 

 

4.2.1.2.2. 第三步:编写配置类代码

--通过该配置类的代码替换掉Spring配置文件

package cn.zj.spring.config;

 

import javax.sql.DataSource;

 

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

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

 

import com.alibaba.druid.pool.DruidDataSource;

 

/*

 * @Configuration

 * 说明把当前类当做成Spring框架的配置文件

 * @ComponentScan

 *  配置注解包扫描的位置

 * @PropertySource("classpath:db.properties")

 *  读取.peroperties 后缀的配置文件

 */

 

@Configuration

//@ComponentScan(basePackages= {"cn.zj.spring.action","cn.zj.spring.service","cn.zj.spring.dao"})

@ComponentScan("cn.zj.spring")

@PropertySource("classpath:db.properties")

public class SpringConfig {

 

 

/**

 * @Value(value="")

 * 可以从Spring容器读取 .properties 配置文件内容

 * value :配置文件的对应的key -->使用 ${key} 获取

 * 程序运行中自动将 properties 对应key的获取出来设置给字段

 *

 */

 

//等价 <property name="driverClassName" value="${jdbc.driverClassName}">

@Value("${jdbc.driverClassName}")

private String driverClassName;

 

@Value("${jdbc.url}")

private String url;

 

@Value("${jdbc.username}")

private String username;

 

@Value("${jdbc.password}")

private String password;

 

@Value("${jdbc.maxActive}")

private Integer maxActive;

 

 

//<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"

   //init-method="init" destroy-method="close">

@Bean(name="dataSource",initMethod="init",destroyMethod="close")

public DataSource getDataSource() {

DruidDataSource dataSource = new DruidDataSource();

dataSource.setDriverClassName(driverClassName);

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);

dataSource.setMaxActive(maxActive);

return dataSource;

}

 

}

 

 

4.2.1.2.3. 第四步:编写测试代码

package cn.zj.spring.test;

 

import java.sql.Connection;

 

import javax.sql.DataSource;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 

import cn.zj.spring.config.SpringConfig;

 

public class SpringTest {

 

@Test

public void testName() throws Exception {

 

// 1.读取 xml 配置文件,启动框架,创建Spring容器对象

//ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

 

// 1. 读取SpringConfig 类配置文件,启动动框架,创建Spring容器对象

ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

 

//2. 获取 连接池对象

DataSource dataSource = context.getBean("dataSource", DataSource.class);

 

//2.1获取数据库连接对象

Connection conn = dataSource.getConnection();

 

System.out.println(conn);

}

}

 

 

--测试结果,输出组件类调用方法的输出值。配置成功

 

 

5. Spring的测试

5.1. 传统的测试

存在问题:

1,每个测试都要重新启动Spring容器,启动容器的开销大,测试效率低下。

2,不应该是测试代码管理Spring容器,应该是Spring容器在管理测试代码。

 

 

5.2. 正确使用Spring的测试

 

 

5.3. 如何使用Spring测试

5.3.1. 导入spring测试的jar

 

 

Spring测试必须保证Eclipse的单元测试的最低版本是 4.12版本,如果使用的Eclipse版本很低,那么单元测试版本可能低于4.12,那么需要开发者手动导入单元测试的jar

 

如果使用Spring方式测试,必须使用两个注解

 

@RunWith注解

表示先启动Spring容器,把junit运行在Spring容器中

@ContextConfiguration注解

从哪里加载资源文件,默认从src(源目录)下面加载

 

5.3.2. 案例代码

package cn.zj.spring.test;

 

import static org.junit.Assert.*;

 

import javax.annotation.Resource;

import javax.swing.Spring;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

import cn.zj.spring.config.SpringConfig;

import cn.zj.spring.service.CustomerService;

 

//表示先启动Spring容器,把junit运行在Spring容器中

@RunWith(SpringJUnit4ClassRunner.class)

//表示从哪里加载资源文件,默认从src(源目录)下面加载

@ContextConfiguration("classpath:applicationContext.xml")

public class CustomerServiceTest {

 

@Resource

ApplicationContext context;

 

@Test

public void testSpring() throws Exception {

//1.获取Spring容器对象

//AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(“applicationContext.xml”);

 

 

//2.获取CustomerController对象

CustomerService controller = context.getBean("customerService",CustomerService.class);

 

//执行保存方法

controller.save();

}

}

 

 

5.3.3. 纯注解方式的配置

 

@ContextConfiguration()

 classes 属性读取spring的纯java配置文件

package cn.zj.spring.test;

 

import static org.junit.Assert.*;

 

import javax.annotation.Resource;

import javax.swing.Spring;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

import cn.zj.spring.config.SpringConfig;

import cn.zj.spring.service.CustomerService;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes=Spring.class)

public class CustomerServiceTest {

 

@Resource

ApplicationContext context;

 

@Test

public void testSpring() throws Exception {

//1.获取Spring容器对象

//AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);

 

 

//2.获取CustomerController对象

CustomerService controller = context.getBean("customerService",CustomerService.class);

 

//执行保存方法

controller.save();

}

}

 

6. SpringJDBC操作

Spring对象也支持JDBC,JDBC只进行了薄薄的一层封装

问题: Java开发已经有JDBC,为什么Spring还要支持JDBC操作呢?

最重要的原因: Spring操作JDBC自动管理事务

 

6.1. 操作步骤

1,创建数据库 spring_jdbc

2.创建数据表 t_user

CREATE TABLE `t_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) DEFAULT NULL,

  `email` varchar(50) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.创建对应的domain对象

public class User {

private Integer id;

private String name;

private String email;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", email=" + email + "]";

}

public User(Integer id, String name, String email) {

super();

this.id = id;

this.name = name;

this.email = email;

}

public User() {

super();

// TODO Auto-generated constructor stub

}

 

}

4.创建DAO

public class UserDaoImpl implements UserDao {

 

@Override

public void save(User user) {

 

}

 

@Override

public void delete(Integer id) {

}

 

@Override

public void update(User user) {

 

}

 

@Override

public User findById(Integer id) {

 

return null;

}

 

@Override

public List<User> list() {

 

return null;

}

}

5.创建Service

public class UserServiceImpl implements UserService {

 

private UserDao dao;

 

@Override

public void save(User user) {

dao.save(user);

}

 

@Override

public void delete(Integer id) {

dao.delete(id);

}

 

@Override

public void update(User id) {

dao.update(id);

}

 

@Override

public User findById(Integer id) {

// TODO Auto-generated method stub

return dao.findById(id);

}

 

@Override

public List<User> list() {

// TODO Auto-generated method stub

return dao.list();

}

 

public void setDao(UserDao dao) {

this.dao = dao;

}

}

6.测试代码

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class UserServiceTest {

 

 

@Resource

private UserService service;

 

@Test

public void testSave() {

 

User user = new User(null, "乔峰", "qf@qq.com");

 

service.save(user);

}

 

@Test

public void testDelete() {

service.delete(3);

}

 

@Test

public void testUpdate() {

User user = new User(2, "段誉", "123123sdfsdf@qq.com");

service.update(user);

}

 

@Test

public void testFindById() {

 

User user = service.findById(1);

System.out