美文网首页
Spring之Annotation

Spring之Annotation

作者: _FireFly_ | 来源:发表于2020-11-29 16:35 被阅读0次

    Spring注解的方式实现对象的管控

    注解作用与XML形式的作用是一样的,用于对象创建的注解<bean id="" class="">

    @Component(value="id")

    value可以省略 @Component("id"),小括号都可以省略@Component,如果value不写,id默认为类名字的驼峰式

    @Component("studentController")
    public class StudentController {
    
        //属性  业务层小弟
        @Autowired
        private StudentService service;
    
    
        public StudentService getService() {
            return service;
        }
    
        //自己控制方法
        public void contollerMethod(String ssex){
            System.out.println("controllerMethod");
            service.serviceMethod(ssex);
        }
    }
    

    @RestController

    @RestController = @Controller + @ResponseBody 组成
    它的作用简短的说就是指该类中所有的API接口返回的数据,不管你对应的方法返回值是Map或是其他Object,它都会以Json字符串的形式返回给客户端

    @RestController
    @RequestMapping("test")
    public class SampleController {
    
        @GetMapping        //以get方式发起的请求
        public Map testGet() {
            HashMap<String, String> map = new HashMap<String, String>()
            map.put("name", "springboot");
            return map;
        }
    
        @GetMapping(path = "str")
        public String testGetStr() {
            return "OK";
        }
    }
    

    @Controller

    @Controller("studentController")
    public class StudentController {
    
        //属性  业务层小弟
        @Autowired
        private StudentService service;
    
    
        public StudentService getService() {
            return service;
        }
    
        //自己控制方法
        public void contollerMethod(String ssex){
            System.out.println("controllerMethod");
            service.serviceMethod(ssex);
        }
    }
    

    @Service

    @Service("studentService")
    public class StudentService {
    
        //属性 DAO小弟
        private StudentDao dao;
        @Autowired
        public void setDao(StudentDao dao) {
            this.dao = dao;
        }
    
        //自己业务方法
        public void serviceMethod(String ssex){
            System.out.println("serviceMethod");
            dao.select(ssex);
        }
    }
    

    @Repository

    @Repository("studentDao")
    public class StudentDao {
    
        //属性 小弟JdbcTemplate     SqlSession
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
    
        //dao自己的方法
        public void select(String ssex){
            System.out.println("daoMethod");
            String sql = "select * from student where ssex = ?";
            List list = jdbcTemplate.queryForList(sql,ssex);
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
        }
    }
    

    用于对象创建后的机制<bean id="" class="" scope="singleton" lazy-init="false" init-method destroy-method>

    @Scope("singleton 单例 | prototype 多例")

    @Lazy(true) 懒加载 默认为true

    @PostConstructor 在创建对象之后就执行的方法,写在方法上面

        @PostConstructor    
        public void init() {
             System.out.println("init");
        }
    

    @PreDestroy 在关闭spring容器(BeanFactory .close())对象被回收执行的方法,写在方法上面

        @PreDestroy     
        public void destroy() {
            System.out.println("destroy");
        }
    

    对象中可能含有属性

    属性的自动注入DI

    @Autowired

    属性上面 属性对应的set方法上面 带有参数的构造方法上面

    @Qualifier

    属性对象注入的微调整 属性有多个对象对应 选择其中一个

    @Component
    public class Impl1 implements TestInterface{
    }
    
    @Component
    public class Impl2 implements TestInterface{
    }
    
    @Autowired
    @Qualifier("impl2")
    private TestInterface testInterface;
    

    @Value("值")

    还支持SpEL @Value("${值}")

        @Value("1")
        private Integer sid;
        @Value("zzt")
        private String sname;
        @Value("男")
        private String ssex;
        @Value("18")
        private Integer sage;
    

    @Resource(name="") import javax.Resource;

    一个@Resource(name="") 等价于 @Autowired+@Qualifier 俩个注解
    不是Spring家族提供的注解 ,Java提供的 ,从统一性来讲不好。

    @Autowired
    @Qualifier("impl2")
    private TestInterface testInterface;
    
    与下面效果相同
    
    @Resource(name="impl2")
    private TestInterface testInterface;
    

    jdbc.properties ------位于src目录下

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/newtest?useSSL=false&characterEncoding=UTF-8
    user=root
    password=123456
    

    @Configuration

    告知Spring这个类是我的配置 需要让他干活

    @ComponentScan(basePackages={"configclass","controller","service","dao","domain"})

    告知Spring需要扫描其他包,等价于ApplicationContext.xml文件中<context:component-scan base-package="controller,service,dao,domain"></context:component-scan>,扫描有注解的包

    @Import(ConfigClass.class)

    如果主配置中方法过多,主配置类拆开,变成多个小配置类,主配置类中通过@Import(小配置类.class)进行引入

    MainConfig ----主配置类

    /**
     * 主配置
     */
    
    @Configuration       //告知Spring这个类是我的配置 需要让他干活
    @ComponentScan(basePackages={"configclass","controller","service","dao","domain"})
    @Import(ConfigClass.class)
    public class MainConfig {
    }
    

    @PropertySource("classpath:jdbc.properties")

    告诉这个类去读取src目录下的jdbc.properties文件

    @Value("${driverClassName}")

    使用外部配置文件的方式引入,读取src目录下的jdbc.properties文件的driverClassName=com.mysql.jdbc.Driver

    @Bean

    如果bean注解中不写id,方法名字即使默认对象的id

        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource){
            return new JdbcTemplate(dataSource);
        }
    

    ConfigClass --------------小配置类

    /**
     *           小配置类
     * 这个类的目的是用来替代原有spring核心文件背后的目的
     * 原来:核心文件---加载文件中的类名字---反射创建对象
     * 现在:通过这个自定义类 创建对象
     *      通过这个类中自定义方法 实现创建对象
     */
    
    @PropertySource("classpath:jdbc.properties")
    public class ConfigClass {
    
        @Value("${driverClassName}")
        private String driverClassName;
        @Value("${url}")
        private String url;
        @Value("${user}")  //这里不能用username,spring底层也有个配置文件名字为username,读取不到自定义properties文件中的username值
        private String user;
        @Value("${password}")
        private String password;
    
        //定义一个方法 目的是获取一个对象 JdbcTemplate类型
        //  肯定有返回值
        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource){
            return new JdbcTemplate(dataSource);
        }
    
        //再定义一个方法 目的是获取一个DataSource类型的对象
        @Bean
        public DataSource dataSource(){
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            System.out.println(driverClassName);
            System.out.println(url);
            System.out.println(user);
            System.out.println(password);
            dataSource.setDriverClassName(driverClassName);
            dataSource.setUrl(url);
            dataSource.setUsername(user);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    

    通过注解的方式读取配置信息

    public class TestMain {
        public static void main(String[] args) {
            //通过扫描注解的方式获取一个工厂对象 改变创建工厂的类
            BeanFactory factory = new AnnotationConfigApplicationContext(MainConfig.class);
            StudentController controller = (StudentController) factory.getBean("studentController");
            controller.contollerMethod("男");
        }
    }
    

    通过方法创建对象

    这里通过createUser方法来创建User对象 对象名为UserFac

    public class UserFactory{
       public static User createUser(){
           return  new User();
       }
    }
    
    <bean id="userFac" class="com.video.spring.UserFactory" factory-method="createUser">
    

    相关文章

      网友评论

          本文标题:Spring之Annotation

          本文链接:https://www.haomeiwen.com/subject/wueaiktx.html