目录
1.2 纯注解开发(Spring3. 0升级了纯注解开发模式)
单例模式,init()方法执行一次,destory()方法执行一次!!!
非单例模式,init()方法执行一次,不会执行 destory()方法!!!
1.注解开发定义bean
1.1注解开发
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void print() {
System.out.println("BookDaoImp print()");
}
}
@Component
public class BookServiceImp implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void print() {
System.out.println("BookServiceImp print()");
}
}
public class App {
public static void main(String[] args) {
//1.获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取Bean对象
BookDao bookDao = (BookDao) ctx.getBean("bookDao");//注解指定名称
BookService bookService = ctx.getBean(BookService.class);//注解没有指定名称
bookService.print();
bookDao.print();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
">
<!--包扫描-->
<context:component-scan base-package="com.dao.impl"/>
<context:component-scan base-package="com.service.impl"/>
</beans>
衍生注解(功能完全一样)
1.2 纯注解开发(Spring3. 0升级了纯注解开发模式)
//纯注解开发
@Configuration
@ComponentScan({"com.dao","com.service"})
public class SpringConfig {
}
public class App2 {
public static void main(String[] args) {
//1.加载配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
BookDao bookDao = (BookDao) ctx.getBean("bookDao");//注解指定名称
BookService bookService = ctx.getBean(BookService.class);//注解没有指定名称
bookService.print();
bookDao.print();
}
}
2.bean管理
单例模式,init()方法执行一次,destory()方法执行一次!!!
@Component("bookDao")
public class BookDaoImpl implements BookDao {
@PostConstruct//bean生命周期的方法:在构造方法之后
public void init(){
System.out.println("init...");
}
@PreDestroy//bean生命周期的方法:彻底销毁之前
public void destory(){
System.out.println("destory...");
}
public void print() {
System.out.println("BookDaoImp print()");
}
}
//纯注解开发
public class App2 {
public static void main(String[] args) {
//1.加载配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
ctx.registerShutdownHook();
//单例模式下的控制台输出
//init... //加载配置类的时候执行一次
//BookDaoImp print()
//destory...
}
}
非单例模式,init()方法执行一次,不会执行 destory()方法!!!
@Component("bookDao")
@Scope("prototype")//非单例
public class BookDaoImpl implements BookDao {
@PostConstruct//bean生命周期的方法:在构造方法之后
public void init(){
System.out.println("init...");
}
@PreDestroy//bean生命周期的方法:彻底销毁之前
public void destory(){
System.out.println("destory...");
}
public void print() {
System.out.println("BookDaoImp print()");
}
}
//纯注解开发
public class App2 {
public static void main(String[] args) {
//1.加载配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
ctx.registerShutdownHook();
//非单例模式下的控制台输出
//init... //加载配置类的时候执行一次
//init... //获取Bean对象的时候执行一次
//BookDaoImp print()
}
}
单例模式是将bean 放到缓存池中,所以会执行destroy。多例是为调用者创建bean ,然后就不管了,所以不会执行destroy
3.依赖注入
3.1引用类型的依赖注入
没有相同类型的Bean,默认根据类型装配
@Configuration
@ComponentScan({"com.dao","com.service"})
public class SpringConfig {
}
@Repository //数据层的@Component
public class UserDaoImpl implements UserDao {
public void print() {
System.out.println("UserDaoImpl print()");
}
}
@Service //业务层的@Component
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void print() {
System.out.println("UserServiceImpl print()");
userDao.print();
}
}
//纯注解开发,自动装配
public class App3 {
public static void main(String[] args) {
//1.加载配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
UserService userService = ctx.getBean(UserService.class);
userService.print();
}
}
有相同类型的Bean,必须根据名称装配
@Repository("brandDao")
public class BrandDaoImpl implements BrandDao {
public void print() {
System.out.println("BrandDaoImpl print()");
}
}
@Repository("brandDao2")
public class BrandDaoImpl2 implements BrandDao {
public void print() {
System.out.println("BrandDaoImpl2 print()");
}
}
@Service
public class BrandServiceImpl implements BrandService{
@Autowired
@Qualifier("brandDao2")
private BrandDao brandDao;
public void print() {
System.out.println("BrandServiseImpl print()");
brandDao.print();
}
}
//纯注解开发,自动装配
public class App4 {
public static void main(String[] args) {
//1.加载配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
BrandService brandService = ctx.getBean(BrandService.class);
brandService.print();
}
}
3.2 简单类型的依赖注入
#这是配置文件UserDao.properties
name=zhangsan
@Configuration//表示这是一个配置类
@ComponentScan({"com.dao","com.service"})//包扫描
@PropertySource("UserDao.properties")//加载配置文件
public class SpringConfig {
}
@Repository //数据层的@Component
public class UserDaoImpl implements UserDao {
// @Value("zhangsan") //自动装配简单类型,直接赋值
@Value("${name}")//自动装配简单类型,从配置文件中读取
private String name;
public void print() {
System.out.println("UserDaoImpl print()");
System.out.println("name:"+name);
}
}
@Service //业务层的@Component
public class UserServiceImpl implements UserService {
@Autowired //自动装配引用类型
private UserDao userDao;
public void print() {
System.out.println("UserServiceImpl print()");
userDao.print();
}
}
//纯注解开发,自动装配简单类型
public class App5 {
public static void main(String[] args) {
//1.加载配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取Bean对象
UserService userService = ctx.getBean(UserService.class);
userService.print();
//UserServiceImpl print()
//UserDaoImpl print()
//name:zhangsan
}
}
4.管理第三方Bean
4.1注解开发管理第三方Bean
public class JdbcConfig {
//1.定义一个方法获得要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个bean
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
druidDataSource.setUsername("root");
druidDataSource.setPassword("1234");
return druidDataSource;
}
}
@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {
}
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource bean = ctx.getBean(DataSource.class);
System.out.println(bean);
}
}
4.2第三方Bean注入资源
4.2.1第三方Bean注入基本类型的资源
方式一:直接赋值
//简单类型的依赖注入
public class JdbcConfig2 {
//1.定义一个方法获得要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个bean
@Value("com.mysql.cj.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC")
private String url;
@Value("root")
private String userName;
@Value("1234")
private String passWord;
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(passWord);
return druidDataSource;
}
}
@Configuration
@Import(JdbcConfig2.class)
public class SpringConfig2 {
}
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig2.class);
DataSource bean = ctx.getBean(DataSource.class);
System.out.println(bean);
}
}
方式二:加载配置文件
#这是DataSource的配置文件dataSource.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
userName=root
passWord=1234
//简单类型的依赖注入
@PropertySource("dataSource.properties")//加载配置文件
public class JdbcConfig4 {
//1.定义一个方法获得要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个bean
@Value("${driver}")
private String driver;
@Value("${url}")
private String url;
@Value("${userName}")
private String userName;
@Value("${passWord}")
private String passWord;
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(passWord);
return druidDataSource;
}
}
@Configuration
@Import(JdbcConfig4.class)
public class SpringConfig4 {
}
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
DataSource bean = ctx.getBean(DataSource.class);
System.out.println(bean);
}
}
4.2.2第三方Bean注入引用类型的资源
public class JdbcConfig3 {
//1.定义一个方法获得要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个bean
@Bean
public DataSource dataSource(UserDao userDao) {
//引用类型的依赖注入
System.out.println(userDao);
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
}
@Configuration
@Import(JdbcConfig2.class)
@ComponentScan("com.dao")//要能扫描到依赖的Bean
public class SpringConfig3 {
}
@Repository
public class UserDaoImpl implements UserDao {
}
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
DataSource bean = ctx.getBean(DataSource.class);
System.out.println(bean);
}
}