一、@Component定义bean:
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
在实现类上面加上@Component("bookDao")代表定义bean,并给他起名叫bookDao
<bean id="bookDao" class="net.lzzy.dao.Impl.BookDaoImpl"/>
想要使用注解开发需要在spring配置文件添加扫描配置: base-package指定扫描@Component的位置,base-package="net.lzzy"表示扫描当前包下的使用子包
<context:component-scan base-package="net.lzzy"/>
Spring提供@Component注解的三个衍生注解:功能一样,使用原因:方便理解
1、@Controller :用于表现层bean定义
2、@Service :用于业务层bean定义
3、@Repository :用于数据层bean定义
二、纯注解开发
1、新建一个SpringConfig配置类
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"net.lzzy.service","net.lzzy.dao"})
public class SpringConfig {
}
2、@Configuration声明当前类为Spring配置类,代替了spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
</beans>
3、@ComponentScan({"net.lzzy.service","net.lzzy.dao"})代替了
<context:component-scan base-package="net.lzzy"/>
4、应用程序
public static void main(String[] args) {
//AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
//按类型获取bean
BookService bookService = ctx.getBean(BookService.class);
System.out.println(bookService);
}
AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器相当于
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
三、依赖注入:自动装配
1.复杂类型
使用@Autowired注解开启自动装配模式(按类型)无需提供set方法
如果有多个Bean就使用@Qualifier来指定使用的Bean
@Qualifier("bookDao")自动装配指定的类型名称,但是必须需要配合 @Autowired使用
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
public void save() {
System.out.println("book dao save ..." + name);
}
}
2.简单类型
使用@Value实现简单类型注入(值类型)
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
//@Value:注入简单类型(无需提供set方法)
@Value("${name}")
private String name;
public void save() {
System.out.println("book dao save ..." + name);
}
}
若想使用@Value("${name}")需要在配置类里面加上:@PropertySource({"jdbc.properties"})
@Configuration
@ComponentScan("net.lzzy")
//@PropertySource加载properties配置文件
@PropertySource({"jdbc.properties"})
public class SpringConfig {
}
四、第三方的bean管理
spring配置类@Import({JdbcConfig.class})引入配置
@Configuration
//@Import:导入配置信息
@Import({JdbcConfig.class})
public class SpringConfig {
}
使用@Bean定义配置
public class JdbcConfig {
//1.定义一个方法获得要管理的对象
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("root")
private String password;
//2.添加@Bean,表示当前方法的返回值是一个bean
//@Bean修饰的方法,形参根据类型自动装配
@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;
}
}