Spring纯注解开发
一、和xml配置文件开发相比:
1、使用Java类替换了xml配置文件
package com.test.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.test.dao","com.test.service"})
public class SpringConfig {
}
2、@Configuration注解替换了配置文件的结构
3、@ComponentScan()替换了包扫描:
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
4、核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
二、定义Bean
1、使用 @Component(“addr”)注解 定义Bean
(1)数据层Bean定义:
package com.test.dao.impl;
import com.test.dao.Address;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
@Repository("addr")
public class AddrImpl implements Address {
public void henan() {
System.out.println("I an from henan......");
}
}
(2)业务层Bean定义:
@Service("userService")
public class UserServiceImpl implements UserService {
private UserDao userDao;
private PasswdDao passwdDao;
private Address address;
public void save() {
System.out.println("user service is running....");
address.henan();
}
(3)main
import com.test.config.SpringConfig;
import com.test.dao.Address;
import com.test.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Annotation {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
Address addr = (Address) ctx.getBean("addr");
System.out.println(addr);
UserService us = (UserService)ctx.getBean("userService");
System.out.println(us);
}
}
@Component包含:@Controller、@Service、@Repository
三、Bean的作用范围和生命周期:
1、Scope定义Bean的作用范围:
@Repository("addr")
//@Scope("singleton") //代表单例使用,可以直接省略括号内容用@Scope代替
//@Scope("prototype") //非单例
public class AddrImpl implements Address {
public void henan() {
System.out.println("I an from henan......");
}
}
2、Bean的生命周期:@PostConstruct、@PreDestroy
@Repository("addr")
//@Scope("singleton")
//@Scope("prototype")
public class AddrImpl implements Address {
public void henan() {
System.out.println("I an from henan......");
}
@PostConstruct
public void init() {
System.out.println("init......");
}
@PreDestroy
public void destroy() {
System.out.println("destroy......");
}
}
执行main:
import com.test.config.SpringConfig;
import com.test.dao.Address;
import com.test.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Annotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
Address addr = (Address) ctx.getBean("addr");
System.out.println(addr);
UserService us = (UserService)ctx.getBean("userService");
System.out.println(us);
ctx.close();
}
}
四、依赖注入——自动装配:
1、注入引用类型
数据接口:
public interface Address {
public void henan();
}
数据实现类:
@Repository("addr")
//@Scope("singleton")
//@Scope("prototype")
public class AddrImpl implements Address {
public void henan() {
System.out.println("I an from henan......");
}
}
业务接口:
@Service("userService")
public class UserServiceImpl implements UserService {
private UserDao userDao;
private PasswdDao passwdDao;
// @Autowired //按照类型 自动装配 可省略setter方法
@Autowired
@Qualifier("addr") //按照名称 自动装配 没有相同类型Bean可省略此注解
private Address address;
public void save() {
System.out.println("user service is running....");
address.henan();
}
@Qualifier无法单独使用,必须搭配 @Autowired
main:
public class Annotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService us = (UserService)ctx.getBean("userService");
// System.out.println(us);
us.save();
// ctx.close();
}
}
2、注入简单类型
数据实现类添加String类型
@Repository("addr")
public class AddrImpl implements Address {
@Value("hello") //@Value注解为参数赋值
private String name; //添加的String简单类型
public void henan() {
System.out.println("I an from henan......"+name);
}
}
3、加载外部文件
创建jdbc.properties文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=root
配置类添加@PropertySource注解
@PropertySource:加载外部文件 多个文件以数组的形式用,逗号分隔,中不可使用*命名文件
package com.test.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@ComponentScan({"com.test.dao","com.test.service"})
@PropertySource("jdbc.properties") //加载外部文件 多个文件以数组的形式用,逗号分隔;中不可使用*
public class SpringConfig {
}
数据实现类:
@Repository("addr")
public class AddrImpl implements Address {
@Value("${jdbc.username}") //取文件中jdbc.username的值赋给name
private String name;
public void henan() {
System.out.println("I an from henan......"+name);
}
}
执行结果
五、管理第三方Bean
以Duid为例,导包:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
在配置类中创建一个定义一个获得要管理的对象的方法:
@Configuration
public class SpringConfig {
@Bean //表示当前方法的返回值是个Bean
public DataSource DataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/test");
ds.setPassword("root");
ds.setUsername("root");
return ds;
}
}
main函数执行结果:
public class Annotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource bean = ctx.getBean(DataSource.class);
System.out.println(bean);
}
}
第三方Bean依赖注入:
1、简单类型:
@Configuration
//@ComponentScan({"com.test.dao","com.test.service"})
//@PropertySource("jdbc.properties")
public class SpringConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://127.0.0.1:3306/test")
private String url;
@Value("root")
private String username;
@Value("root")
private String password;
@Bean //表示当前方法的返回值是个Bean
public DataSource DataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setPassword(username);
ds.setUsername(password);
return ds;
}
}
2、引用类型:
假如引用AddrImpl类:
@Repository("addr")
public class AddrImpl implements Address {
public void henan() {
System.out.println("I an from henan......");
}
}
配置类:
@Configuration
@ComponentScan({"com.test.dao"})
//@PropertySource("jdbc.properties")
public class SpringConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://127.0.0.1:3306/test")
private String url;
@Value("root")
private String username;
@Value("root")
private String password;
@Bean //表示当前方法的返回值是个Bean
public DataSource DataSource(Address addr){ //传入形参
System.out.println(addr); //自动装配 打印形参
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setPassword(username);
ds.setUsername(password);
return ds;
}
}