一、纯注解开发
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