Spring—注解开发
注入bean的方式
如果使用注解的前提:
- 在配置文件中添加component-scan
<context:component-scan base-package="需要扫描包的范围"/>
-
在配置类中添加@ComponentScan(“扫描的路径”)
//表示这个是一个配置类 @Configuration //扫描包,只有扫描了包才可以使用纯注解开发 @ComponentScan("com.itheima") //扫描类路径下面的properties文件 @PropertySource("school.properties") @Import(StudentFactory.class) public class SpringConfig { }
写在类上面
-
@Component
-
@Service->代表Service层
-
@Controller->代表是控制层
-
@Repository
写在方法上
-
@Bean -如果不是写在配置类中,需要使用上面的4个注解中的其中一个
此注解一般是用来加载第三方提供的配置。
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class StudentFactory {
@Bean("getStudent")
public Student getStudent(){
return new Student();
}
}
属性注入
-
@Value(“值”)-普通属性使用这种方式
-
@Autowired-引用类型使用此方式自动状态
- 先按照类型进行匹配,如果有多个相同的类型,则按照成员变量名进行匹配
3.@Qualifier(“注入名”) 这个标签是和@Autowried一起使用
提高类的加载优先级别
- @Primary 如果有两个类实现了同一个接口,可以指定其中一个类的加载优先级@Primary,但是这个注解只能在一个类上使用,不能出现在多个类上
加载properties文件
-
@PropertySource(“指定文件路径”)
PropertySource("classpath:school.properties")
-
@PropertySource({“路径”,“路径”})如果需要读取多个配置文件
@PropertySource({"classpath:school.properties","classpath:jdbc.properties"})
控制Bean的加载
- @DependsOn
-
类上
@DependsOn(“另一个类名”)->使用这个注解的Bean会比指定的Bean先加载到容器中。
应用场景:当A类依赖B类时,可以在B类上使用这个注解,B类就会比A类优先加载。
-
方法上
同上,在同一个类中。当A方法依赖B方法时,可以在B方法上使用这个注解,B方法就会比A方法优先加载。
- @Orde 配置类的加载顺序
在加载构造方法中指定加载顺序也是一样的
-
@Lazy延迟加载
- 可以在再方法上
- 也可以写在类上
需要的时候才进行加载,不需要的时候不进行加载
用注解整合Mybaits
流程
-
JDBCConfig类,配置数据库的链接信息
//配置JDBC的DataSource @Component @PropertySource("jdbc.properties") public class JDBCConfig { //使用配置文件赋值 @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean() public DataSource getDataSource(){ DruidDataSource ds = new DruidDataSource(); //设置数据库的驱动 ds.setDriverClassName(driver); //设置url ds.setUrl(url); //设置用户名 ds.setUsername(password); //设置密码 ds.setPassword(password); //配好的DataSource return ds; } }
- 配置Mybatis中的SqlSessionFactoryBean和映射配置文件
@Component public class MybatisConfig { //配置SqlSessionFactoryBean @Bean //@Autowired DataSource dataSource 这里的参数就是由JDBCConfig中提供的 public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssf = new SqlSessionFactoryBean(); ssf.setDataSource(dataSource); return ssf; } //配置映射文件 @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); //设置与映射配置文件扫描的路径,生成代理对象 msc.setBasePackage("com.itheima"); return msc; } }
- 导入MybatisCofig和JDBCConfig的类到配置类中
//扫描注解 @ComponentScan("com.itheima") //声明这是一个注解类 @Configuration //可以读取properties内容 @PropertySource("classpath:jdbc.properties") //导入其它JDBCConfig和Mybatis到配置中 @Import({JDBCConfig.class, MybatisConfig.class}) public class SpringConfig { }
- 配置Service的Bean到容器中
@Service public class StudentServiceImp implements StudentService { //这个Dao的接口是由Mybatis中MapperScannerConfigurer实现的代理对象 @Autowired private StudentDao studentDao; @Override public List<Student> findAll() { List<Student> all = studentDao.findAll(); return all; } }
- 测试
public class APP { public static void main(String[] args) { //读取核心配置文件 ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); //创建业务层 StudentService bean = ctx.getBean(StudentServiceImp.class); //调用业务层的方法 List<Student> all = bean.findAll(); //打印结果 System.out.println(all); } }
效果
自定义导入器(了解)
-
创建一个类实现ImportSelector接口
public class MyImport implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[0]; } }
-
并重写selectImports方法,返回的是一个String[]数组,数组里面的内容就是存放需要导入Bean的全路径
- 将需要导入的路径写到配置文件中
path=com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.Personimp
2. 读取配置文件,将内容进行切分
public class MyImport implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //读取类路径下面的import.properties文件 ResourceBundle bundle=ResourceBundle.getBundle("import.properties"); //此时得到的内容是:com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.Personimp String path = bundle.getString("path"); //按逗号进行切割 String[] split = path.split(","); return new String[0]; } }
-
配置类中的注解@Import(“指定自己的导入器类”)
//表示这个是一个配置类 @Configuration //指定自己的导入器Class对象 @Import(MyImport.class) public class SpringConfig { }
-
测试
public class StudentTest { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); School bean = ctx.getBean(School.class); System.out.println(bean); } }
-
效果
st {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
School bean = ctx.getBean(School.class);
System.out.println(bean);
}
}
5. 效果
[外链图片转存中...(img-gptkdvqv-1595504237133)]