二Java框架之Spring注解开发
Posted wxygf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二Java框架之Spring注解开发相关的知识,希望对你有一定的参考价值。
文章目录
从Spring2开始引入注解,Spring3已经可以纯注解开发,以避免使用复杂的配置文件
1. IOC/DI注解开发
1.1 Component注解
@Component
-
在对应类上添加Component注解
-
在applicationContext.xml指定要扫描的路径
注意:这里首先创建了context命名空间,然后使用了
component-scan
和base-package
,之后就可以正常获取bean了- 扫描的范围是 base-package 指定的范围
-
测试BookService
//BookServiceImpl.java @Component //可以不添加名称,之后按类型获取
//applicationContext.xml <context:component-scan base-package="org.example"/>
//App.java BookService bookService = ctx.getBean(BookService.class); bookService.save();
@Controller @Service @Repository
这三个注解是Component的衍生注解,作用和Component相同,只是为了区分某个类是属于表现层
、业务层
还是数据层
的类
- Controller注解:表现层,例如BooServlet.java
- Service注解:业务层,例如BookServiceImpl.java
- Repository注解:数据层,例如BookDaoImpl.java(代表mybatis里面的mapper部分)
1.2 纯注解开发模式
不再写applicationContext.xml配置文件,而是用Config类替代
-
创建Config类
@Configuration//表示这是个配置类,相当于applicationContext.xml默认部分,如命令空间xmlns那一块内容 @ComponentScan("org.example.dao")//相当于设置了<bean>标签 public class SpringConfig
之前的applicationContext.xml已经可以删除了
-
@Configuration:设置该类为spring配置类
-
@ComponentScan:设置spring配置类扫描路径,此注解只能添加一次,多个数据用格式,如
@ComponentScan("org.example.dao", "org.example.service")
-
-
BookDaoImpl.java
package org.example.dao.impl; @Repository("bookDao") public class BookDaoImpl implements BookDao public void save() System.out.println("book dao save ...");
-
使用SpringConfig:AnnotationConfigApplicationContext
public class APP public static void main(String[] args) ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao = (BookDao) ctx.getBean("bookDao"); System.out.println(bookDao); BookService bookService = ctx.getBean(BookService.class); System.out.println(bookService);
1.3 注解开发bean管理
@Scope
设置是否为单例模式
@PostConstruct @PreDestroy
管理生命周期 init() 和 destroy()
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
ctx.close();//关闭容器,从而可以看到destroy()的信息
1.4 注解开发依赖注入
@Autowired @Qualifier
如果只有一个实现类implements BookDao时,仅需@Autowired即可自动注入
如果只有多个实现类implements BookDao时,还需@Qualifier(“name”)指定哪一个实现类
使用@Autowired可以省略setter方法
@Value
name变量被注入了值 “example”
这样单纯使用@Value是没有意义的,注解主要是为了加载properties文件,使得变量值可更改
@PropertySource
读取Properties配置文件
-
新建jdbc.properties
name=example
-
配置Config类
package org.example.config; @Configuration @ComponentScan("org.example.dao", "org.example.service") @PropertySource("classpath:jdbc.properties") public class SpringConfig
-
注入
package org.example.dao.impl; @Repository("bookDao") public class BookDaoImpl implements BookDao @Value("$name") private String name; public void save() System.out.println("book dao save ..."+name);
注意事项:(1)多个properties配置文件同样使用格式;(2)不支持通配符
1.5 第三方bean管理
@Bean
-
导入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
-
配置Config文件
@Configuration public class SpringConfig //1. 定义一个方法获得要管理的对象 //2. 添加@Bean,表示当前方法的返回值是一个bean @Bean public DataSource dataSource() DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/spring_db"); ds.setUsername("root"); ds.setPassword("root"); return ds;
-
获取Bean并运行
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource);
@import(多个Config类)
像是上面的dataSource()这类的通常会专门创建一个Config类,如JdbcConfig,现在需要使其生效
方法一(不推荐)
-
JdbcConfig.java
@Configuration public class JdbcConfig @Bean public DataSource dataSource() DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/spring_db"); ds.setUsername("root"); ds.setPassword("root"); return ds;
-
还需要配置SpringConfig.java
@Configuration @ComponentScan("org.example.config") public class SpringConfig
方法二(推荐)
-
JdbcConfig.java
public class JdbcConfig //注意,没再使用@Configuration @Bean public DataSource dataSource() DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/spring_db"); ds.setUsername("root"); ds.setPassword("root"); return ds;
-
配置SpringConfig.java
@Configuration @Import(JdbcConfig.class) public class SpringConfig
练习:使用@Value和properties文件修改上述代码
引用类型的注入
-
BookDaoImpl.java
@Repository public class BookDaoImpl implements BookDao public void save() System.out.println("book dao save ...");
-
SpringConfig.java
@Configuration @ComponentScan("org.example.dao")//关联到BookDaoImpl @Import(JdbcConfig.class) public class SpringConfig
-
JdbcConfig.java
@PropertySource("classpath:jdbc.properties") public class JdbcConfig @Value("$jdbc.driver") private String driver; @Value("$jdbc.url") private String url; @Value("$jdbc.username") private String username; @Value("$jdbc.password") private String password; @Bean public DataSource dataSource(BookDao bookDao) System.out.println(bookDao); DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); return ds;
-
自动装配
上面仅提供了一个形参bookDao,即可自动注入
这是因为@Bean使其认为形参应当被自动提供,于是将自动寻找相应的类,并注入到形参中
总结
- 1.第三方Bean管理
- @Bean
- 2.第三方依赖注入
- 引用类型:方法形参
- 简单类型:成员变量
1.6 XML配置和注解配置对比
2. Spring整合MyBatis
2.1 mybatis写法回顾
-
创建javaweb项目,在pom.xml添加
<packaging>war</packaging>
-
配置pom.xml依赖和插件
<dependencies> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> </dependencies> <build> <plugins> <!--Tomcat插件,非必要 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>
-
编写mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="$jdbc.driver"/> <property name="url" value="$jdbc.url"/> <property name="username" value="$jdbc.username"/> <property name="password" value="$jdbc.password"/> </dataSource> </environment> </environments> <mappers> <package name="org.example.mapper"/> </mappers> </configuration>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///spring_db?useSSL=false&useServerPrepStmts=true jdbc.username=root jdbc.password=123456
-
创建AcccountMapper.xml和AccontMapper接口
AccountMapper.xml<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.AccountMapper"> </mapper>
AccontMapper接口
package org.example.mapper; public interface AccountMapper @Insert("insert into tbl_account(name,money)values(#name,#money)") void save(Account account); @Delete("delete from tbl_account where id = #id ") void delete(Integer id); @Update("update tbl_account set name = #name , money = #money where id = #id ") void update(Account account); @Select("select * from tbl_account") List<Account> findAll(); @Select("select * from tbl_account where id = #id ") Account findById(Integer id);
在这一部分定义sql语句
-
编写service方法负责业务逻辑层,主要是调用数据库
准备工具类:SqlSessionFactoryUtilspackage org.example.util; public class SqlSessionFactoryUtils private static SqlSessionFactory sqlSessionFactory; static try String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); catch (IOException e) e.printStackTrace(); public static SqlSessionFactory getSqlSessionFactory() return sqlSessionFactory;
编写AccountService接口
public interface AccountService List<Account> findAll();
AccountService.java
package org.example.service.impl; public class AccountServiceImpl implements AccountService private SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory(); @Override public List<Account> findAll() SqlSession session = factory.openSession(); AccountMapper mapper = session.getMapper(AccountMapper.class); List<Account> accounts = mapper.findAll(); session.close(); return accounts;
-
接下来应该是在servlet类里面调用service方法,这里写在main函数里面
package org.example; public class Main public static void main(String[] args) AccountService service = new AccountServiceImpl(); List<Account> accounts = service.findAll(); System.out.println(accounts);
即可成功获取到数据库数据
当Spring需要整合mybatis时,真正需要交给Spring管理的是SqlSessionFactory
2.2 整合:导入依赖:pom.xml
<dependencies>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<versionspring boot框架学习学前掌握之重要注解-java配置方式
spring boot框架学习学前掌握之重要注解-通过java的配置方式进行配置spring