Spring常用的注解(绝对童叟无欺)

目录

 

一、Spring常用注解-IOC相关

1、用于创建对象

2、用于改变作用范围

3、生命周期相关​​​​​​​

二、加载第三方资源的注解

1、@Bean

2、@bean  和 @component  区别是什么?

3、使用注解整合MyBaitis

4、使用注解整合JDBC

5、小结

三、用于注入数据的注解-DI相关注解

1、引用类型属性注入

 2、普通类型属性注入


 

一、Spring常用注解-IOC相关

1、用于创建对象

与xml配置中的<bean id=""  class="">标签的作用是一样的,注解是放在类上的

@Component  ==> 通用类型的
@Controller ==> 控制层
@Service    ==> 业务层
@Repository ==> 数据访问层 / 持久层

作用: 使我们的三层架构的对象,更加清晰, 使开发更规范,符合三层架构!

细节:如果注解中有且只有一个属性要赋值时,value属性是可以不写的,默认是类名,首字母小写

这4个注解有何不同?可以混用吗?

  • 这4个注解作用是一样的,但是我们不建议混用!
  • 原因: 三层架构: ----分别使用  @Controller  @Service  @Repository 
  • @Component   --三层架构之外时使用@Component,  主要用于实体类

2、用于改变作用范围

作用和xml配置中的<bean>标签的scope属性的作用一样

@Scope

作用:
    指定bean的作用范围。

属性:
    value:指定范围的值。 
    取值:`singleton` `prototype` `request` `session` `globalsession`  
    常用取值:单例 singleton    多例 prototype

3、生命周期相关

作用和xml配置中的<bean>标签的init-method和destroy-method属性的作用是一样的

    @PostConstruct  -- 注解放在方法上;初始化对象时执行
    @PreDestroy   -- 注解放在方法上;对象销毁时执行

 

二、加载第三方资源的注解

 

1、@Bean

//@Bean 用于把当前方法的返回值作为bean对象存入spring的ioc容器中,可以指定bean的id。

@Bean("dataSource")
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

 

2、@bean  和 @component  区别是什么?

@bean注解    写在方法上, 方法的返回值存入spring容器;

@component   写在类上, 给当前类创建对象,存入spring容器中!

 

3、使用注解整合MyBaitis

public class MyBatisConfig {

    /*  spring整合mybatis后控制的创建连接用的对象
        <bean class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="typeAliasesPackage" value="com.jing.domain"/>
        </bean>*/
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.jing.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

    /* 加载mybatis映射配置的扫描,将其作为spring的bean进行管理
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.jing.dao"/>
    </bean>*/
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.jing.dao");
        return msc;
    }
}

Spring常用的注解(绝对童叟无欺)

 

4、使用注解整合JDBC

/**
 *     加载druid资源
 *     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
 *         <property name="driverClassName" value="${jdbc.driver}"/>
 *         <property name="url" value="${jdbc.url}"/>
 *         <property name="username" value="${jdbc.username}"/>
 *         <property name="password" value="${jdbc.password}"/>
 *     </bean>
 */

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("dataSource")
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

 

然后就可以配置类 导入了

 

@Configuration
@ComponentScan("com.jing")
@PropertySource("classpath:jdbc.properties")
@Import({JDBCConfig.class,MyBatisConfig.class})
public class SpringConfig {
}

@Configuration   指定当前类作为一个配置类,在创建容器时作为参数传入! (就是替代applicationContext.xml)


@ComponentScan("com.jing")  用于指定spring在初始化容器时要扫描的包
     对比xml文件的配置:<context:component-scan base-package="com.jing"/>


@PropertySource("classpath:jdbc.properties")  加载jdbc.properties配置文件的信息
     对比xml文件的配置:<context:property-placeholder location="classpath:jdbc.properties"/>


@Import({JDBCConfig.class,MyBatisConfig.class})  加载到核心配置

 

如果使用junit测试

则使用 @RunWith   和  @ContextConfiguration

//设置Spring专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//设定加载的Spring上下文对应的配置
@ContextConfiguration(classes = SpringConfig.class)
public class UserTest {
    @Autowired
    private UserService userService;

    @Test
    public void test01(){
        int size = userService.findAll().size();
        Assert.assertEquals(8,size);
    }
}

 

5、小结

经过上面的代码实现可以看到,使用第三方注解会比写xml文件繁琐一些,所以一般推荐使用

半注解+半xml 来开发

 

三、用于注入数据的注解-DI相关注解

作用和xml配置中的<bean>标签中的<property>标签作用一样 注解放在成员变量上

 

1、引用类型属性注入

@Autowired /*自动按照类型注入,
            如果有多个类型相同时, 那么判断bean的id是否和 变量名是否一致,
            如果一致那么就对应的注入,也就是  先按照类型 再按照变量名!*/

@Qualifier /*在自动按照类型注入的基础之上,再按照Bean的id注入
             它在给字段注入时不能独立使用,
             必须和@Autowire一起使用  ;但是给方法参数注入时,可以独立使用*/
    例如:       @Autowired
                @Qualifier("userDao")
                private UserDao userDao;

@Resource  /*直接按照Bean的id注入。只能注入其他bean类型。

            @Resource 是JDK1.8当中的,在JDK1.9之后移除到扩展模块之中,
            所以如果想使用@Resource注解注入数据
            请使用1.6-1.8及以下版本JDK相当于 

            @Resource  = @Autowired + @Qualifier 
                            
            @Autowired 、 @Qualifier 是Spring框架中的*/

    例如:  @Resource(name = "userDao")
            private UserDao userDao;

 以上三个是给引用变量赋值  -- ref

 2、普通类型属性注入

@Value      /* 给属性赋值 , 用于基本数据类型 >> value
               可以使用SpEL的写法:${表达式}  也就是spring的el表达式 */

例如:
        @Value("张三")
        private String name;


        @Value("${username}")
        private String username;

 

 

上一篇:spring 事务


下一篇:初识java-JDBC