Spring 注解注入Bean

一、纯注解开发

spring3以后纯注解开发 不使用Bean.xml 使用config配置文件加载Bean

1.定义Bean配置文件

@Configuration  //表示设置当前类为配置类 代表Bean.xml
@ComponentScan("org.annotates")  //代表开启了包扫描<context:component-scan base-package="org.annotates"/>

public class SpringConfig {}

2.定义BookDao

@Component("bookDao") //注解Component(组件) 相当于标签 <bean/>  bookDao相当于id
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("这是:BookDaoImpl.....Bean");
    }
}

3.测试
注解开发要使用配置类加载的方式AnnotationConfigApplicationContext获取Bean


 public static void main( String[] args )
    {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        System.out.println(bookDao);
    }

打印结果

com.annotates.dao.impl.BookDaoImpl@1b68b9a4

Process finished with exit code 0

二、@Component衍生注解

1.@Controller 表现层Bean定义 WEB controller

2.@Service 业务层Bean定义 处理业务 Service

3.@Repository 数据层Bean定义 查数据等Dao层

4个注解作用相同,衍生三个注解业务上作区分,都写Component有点区分不清楚

demo演示

在这里插入图片描述

service:

@Service
public class BookServiceImpl implements BookService {
    public void save() {
        System.out.println("这是:BookServiceImpl.....Bean");
    }
}

dao:

@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("这是:BookDaoImpl.....Bean");
    }
}

测试:

 public static void main( String[] args )
 {
     ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

     BookService bookService = ctx.getBean(BookService.class);
     System.out.println(bookService);
     bookService.save();
     
     System.out.println("=====================");
     
     BookDao bookDao = ctx.getBean(BookDao.class);
     System.out.println(bookDao);
     bookDao.save();
 }

结果:

com.annotates.service.impl.BookServiceImpl@176d53b2
这是:BookServiceImpl.....Bean
=====================
com.annotates.dao.impl.BookDaoImpl@971d0d8
这是:BookDaoImpl.....Bean

Process finished with exit code 0

结论:
@Component @Controller @Service @Repository作用相同

三、依赖注入

注解默认都是按照类型byType注入的

1.使用@Autowired 自动注入(基于暴力反射原理,无需提供setter等方法)

@Service
public class BookServiceImpl implements BookService {

    @Autowired. //自动注入(byType)
    private BookDao bookDao;
    public void save() {
        bookDao.save();
    }
}
com.annotates.service.impl.BookServiceImpl@57d5872c
这是:BookDaoImpl.....Bean

Process finished with exit code 0

2.使用@Qualifier 自动注入(按照Bean名称注入 byName)

@Qualifier("bookDao") 选填(如果存在相同类型的bean 需要指定注入的是谁 bookDao,bookDao1)

如果使用该注解。必须配置@Autowired 被依赖的类需定义Bean名称

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("这是:BookDaoImpl.....Bean");
    }
}

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;
    public void save() {
        bookDao.save();
    }
}

结果:

com.annotates.service.impl.BookServiceImpl@64c87930
这是:BookDaoImpl.....Bean

Process finished with exit code 0

四、简单类型注入及 @PropertySource加载配置文件注解的使用

使用@Value实现简单类型的注入

public class BookServiceImpl implements BookService {

    @Value("<三国演义>")
    private String bookName;
    
    public void save() {
    	System.out.println(bookName);
    }
}

结果:

com.annotates.service.impl.BookServiceImpl@4de5031f
<三国演义>

Process finished with exit code 0

SpringConfig创建@PropertySource注解 加载properties文件

@Configuration
@ComponentScan("com.annotates")
@PropertySource({"classpath:book.properties"}) //新加@PropertySource配置 多个路径需要写成数组格式
public class SpringConfig {}

resources下新加book.properties配置文件

bookName=<jack>

使用:${}方式引入

public class BookServiceImpl implements BookService {

    @Value("${bookName}")
    private String bookName;
    
    public void save() {
    	System.out.println(bookName);
    }
}

结果:

com.annotates.service.impl.BookServiceImpl@589b3632
<jack>

Process finished with exit code 0

五、第三方Bean的管理

新建config -> JdbcConfig配置文件

@Bean的使用

public class JdbcConfig {
    //三方bean需要注入属性 简单类型
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;


    //引用类型 直接使用形参方式注入 (根据自动装配byType匹配)
    // public DataSource dataSource(BookDao bookDao)

    //1。定义一个方法获得要管理的对象 (建议方法名字为建议使用的Bean名字)
    //2。添加@Bean注解 表示当前返回的对象是一个Bean

    @Bean("dataSource")
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}
@Configuration
@ComponentScan("com.annotates")
@PropertySource({"classpath:book.properties","classpath:Jdbc.properties"})
@Import({JdbcConfig.class}) //加载三方Bean的配置文件
public class SpringConfig {}

结果:

{
	CreateTime:"2023-03-31 11:25:19",
	ActiveCount:0,
	PoolingCount:0,
	CreateCount:0,
	DestroyCount:0,
	CloseCount:0,
	ConnectCount:0,
	Connections:[
	]
}

Process finished with exit code 0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值